aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/odd_order
diff options
context:
space:
mode:
authorCyril Cohen2015-07-17 18:03:31 +0200
committerCyril Cohen2015-07-17 18:03:31 +0200
commit532de9b68384a114c6534a0736ed024c900447f9 (patch)
treee100a6a7839bf7548ab8a9e053033f8eef3c7492 /mathcomp/odd_order
parentf180c539a00fd83d8b3b5fd2d5710eb16e971e2e (diff)
Updating files + reorganizing everything
Diffstat (limited to 'mathcomp/odd_order')
-rw-r--r--mathcomp/odd_order/BGappendixAB.v37
-rw-r--r--mathcomp/odd_order/BGappendixC.v19
-rw-r--r--mathcomp/odd_order/BGsection1.v88
-rw-r--r--mathcomp/odd_order/BGsection10.v75
-rw-r--r--mathcomp/odd_order/BGsection11.v60
-rw-r--r--mathcomp/odd_order/BGsection12.v123
-rw-r--r--mathcomp/odd_order/BGsection13.v46
-rw-r--r--mathcomp/odd_order/BGsection14.v58
-rw-r--r--mathcomp/odd_order/BGsection15.v71
-rw-r--r--mathcomp/odd_order/BGsection16.v32
-rw-r--r--mathcomp/odd_order/BGsection2.v68
-rw-r--r--mathcomp/odd_order/BGsection3.v156
-rw-r--r--mathcomp/odd_order/BGsection4.v108
-rw-r--r--mathcomp/odd_order/BGsection5.v45
-rw-r--r--mathcomp/odd_order/BGsection6.v22
-rw-r--r--mathcomp/odd_order/BGsection7.v109
-rw-r--r--mathcomp/odd_order/BGsection8.v106
-rw-r--r--mathcomp/odd_order/BGsection9.v27
-rw-r--r--mathcomp/odd_order/Make1
-rw-r--r--mathcomp/odd_order/PFsection1.v157
-rw-r--r--mathcomp/odd_order/PFsection10.v48
-rw-r--r--mathcomp/odd_order/PFsection11.v49
-rw-r--r--mathcomp/odd_order/PFsection12.v143
-rw-r--r--mathcomp/odd_order/PFsection13.v29
-rw-r--r--mathcomp/odd_order/PFsection14.v35
-rw-r--r--mathcomp/odd_order/PFsection2.v37
-rw-r--r--mathcomp/odd_order/PFsection3.v13
-rw-r--r--mathcomp/odd_order/PFsection4.v21
-rw-r--r--mathcomp/odd_order/PFsection5.v605
-rw-r--r--mathcomp/odd_order/PFsection6.v1739
-rw-r--r--mathcomp/odd_order/PFsection7.v20
-rw-r--r--mathcomp/odd_order/PFsection8.v39
-rw-r--r--mathcomp/odd_order/PFsection9.v69
-rw-r--r--mathcomp/odd_order/all.v33
-rw-r--r--mathcomp/odd_order/wielandt_fixpoint.v55
35 files changed, 2059 insertions, 2284 deletions
diff --git a/mathcomp/odd_order/BGappendixAB.v b/mathcomp/odd_order/BGappendixAB.v
index 4cbafd0..386429b 100644
--- a/mathcomp/odd_order/BGappendixAB.v
+++ b/mathcomp/odd_order/BGappendixAB.v
@@ -1,9 +1,16 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div.
+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.
(******************************************************************************)
@@ -72,7 +79,7 @@ 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 exact: subset_trans (normG _).
+ 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.
@@ -145,13 +152,13 @@ have cAG: centgmx rG A.
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 exact/abelem_mx_irrP.
+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 exact: gen_mx_irr.
+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.
@@ -226,14 +233,14 @@ 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 exact: pcore_pgroup.
+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 _; exact: (subsetP sCQ).
+ 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.
@@ -262,7 +269,7 @@ Lemma Puig_char G : 'L(G) \char G.
Proof. exact: gFchar. Qed.
Lemma center_Puig_char G : 'Z('L(G)) \char G.
-Proof. exact: char_trans (center_char _) (Puig_char _). Qed.
+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).
@@ -408,7 +415,7 @@ have sCT_L: 'C_T('L_{k.*2.+1}(T)) \subset 'L_{k.*2.+1}(T).
have{sCT_L} sLT: 'L_{k.*2.+2}(S) \subset T.
apply: odd_abelian_gen_constrained sCT_L => //.
- exact: pgroupS (Puig_at_sub _ _) pT.
- - by apply: char_normal_trans nsTG; apply: gFchar.
+ - 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.
@@ -423,17 +430,17 @@ Let L := 'L(S).
Theorem Puig_center_normal : 'Z(L) <| G.
Proof.
have [sLiST sLTS] := pcore_Sylow_Puig_sub.
-have sLiLT: 'L_*(T) \subset 'L(T) by exact: Puig_sub_even_odd.
+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 := char_trans (center_Puig_char _) (pcore_char _ _).
+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 (subset_trans _ (pHall_sub sylS)) ?Puig_sub.
+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 //.
@@ -446,8 +453,8 @@ have nsL_nCS: L <| 'N_G(C :&: S).
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 //.
- by rewrite (char_normal_trans (Puig_char _)) ?normalSG // subIset // sSG orbT.
+ 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 /=.
@@ -461,7 +468,7 @@ 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) := char_normal_trans (center_char _) nsL_nCS.
+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.
@@ -487,7 +494,7 @@ have def_Zq: Z / D = 'Z('L(S / D)).
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 exact: morphim_pHall.
+ 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.
diff --git a/mathcomp/odd_order/BGappendixC.v b/mathcomp/odd_order/BGappendixC.v
index 31bccfb..75de45b 100644
--- a/mathcomp/odd_order/BGappendixC.v
+++ b/mathcomp/odd_order/BGappendixC.v
@@ -1,9 +1,18 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype choice ssrnat seq div fintype.
+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.
-Require Import gproduct cyclic commutator pgroup abelian frobenius BGsection1.
+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.
@@ -147,7 +156,7 @@ 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 exact: cycFU.
+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].
@@ -528,7 +537,7 @@ have{nHt1} nHP1: P1 \subset 'N(H).
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) (char_norm_trans (pcore_char _ _)).
+ 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.
@@ -552,7 +561,7 @@ 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 /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.
diff --git a/mathcomp/odd_order/BGsection1.v b/mathcomp/odd_order/BGsection1.v
index 98a2d08..ebce90d 100644
--- a/mathcomp/odd_order/BGsection1.v
+++ b/mathcomp/odd_order/BGsection1.v
@@ -1,10 +1,16 @@
-Set Printing Width 50.
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div fintype.
+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.
(******************************************************************************)
@@ -135,13 +141,12 @@ Proof. by move=> minM solM; case: (minnormal_solvable minM (subxx _) solM). Qed.
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 apply: (char_normal_trans (center_char _)); exact: Fitting_normal.
+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 by apply: subset_trans nMG; exact: Fitting_sub.
+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.
@@ -160,10 +165,10 @@ Variables (gT : finGroupType) (G G' : {group gT}).
Hypothesis solG : solvable G.
Hypothesis nsG'G : G' <| G.
-Let sG'G : G' \subset G := normal_sub nsG'G.
-Let nG'G : G \subset 'N(G') := normal_norm nsG'G.
-Let nsF'G : 'F(G') <| G := char_normal_trans (Fitting_char G') nsG'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).
@@ -179,8 +184,8 @@ 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 (subset_trans (normal_sub nsF'G) nVG) /=.
-rewrite subsetI centsC => /andP[_]; apply: subset_trans.
+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.
@@ -237,14 +242,14 @@ move=> nGA coGA solG regAG; without loss cycA: A nGA coGA regAG / cyclic A.
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 exact: pgroup_pi.
+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 := char_normal_trans (pcore_char _ _) (Fitting_normal _).
+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.
@@ -260,7 +265,7 @@ have sFG: F \subset G.
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 // (char_normal_trans (Fitting_char _)).
+ 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.
@@ -442,20 +447,20 @@ without loss defR: G pG nGA coGA cAG1 / [~: G, A] = G.
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 rewrite (subset_trans (OhmS 1 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 exact: center_special_abelem.
+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=> xa; case/imset2P=> x a Gx Aa ->{xa}; rewrite commgEl.
+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.
@@ -526,7 +531,7 @@ 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 exact/commgP/(centP cHyp).
+ 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.
@@ -687,7 +692,7 @@ 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 ?(subset_trans (pcore_sub _ _)) //.
+ 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.
@@ -695,7 +700,7 @@ without loss p'G1: gT G R sRG pR solG / 'O_p^'(G) = 1.
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 exact: pcore_sub.
+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).
@@ -731,7 +736,7 @@ 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 _; exact: subsetIl.
+ 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.
@@ -743,11 +748,10 @@ without loss nilG: G nGA coGA leGn / nilpotent G.
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 _; exact: subsetIl.
+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 nZA: A \subset 'N('Z(G)) := char_norm_trans (center_char G) nGA.
-have{ntZ nZA} [M /= minM] := minnormal_exists ntZ nZA.
+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.
@@ -780,7 +784,7 @@ Proposition coprime_abelian_gen_cent1 gT (A G : {group gT}) :
Proof.
move=> abelA ncycA nGA coGA.
apply/eqP; rewrite eq_sym eqEsubset /= gen_subG.
-apply/andP; split; last by apply/bigcupsP=> B _; exact: subsetIl.
+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).
@@ -819,9 +823,9 @@ have abelSK : abelian (alpha @* S).
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; exact: addrC.
+ 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); exact.
+ 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.
@@ -850,9 +854,9 @@ 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 exact: pcore_normal.
+have /andP[sKG nKG]: K <| G by apply: pcore_normal.
have{nKG} nKS := subset_trans sSG nKG.
-have p'K: p^'.-group K by exact: pcore_pgroup.
+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 //=.
@@ -903,7 +907,7 @@ 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 ?(subset_trans (der_sub _ _)) ?quotientR //= -/Q.
+rewrite -quotient_sub1 ?gFsub_trans ?quotientR //= -/Q.
rewrite -defG quotientMidl (sameP trivgP commG1P) -abelianE.
by rewrite morphim_abelian ?cyclic_abelian.
Qed.
@@ -935,7 +939,7 @@ Lemma cyclic_pdiv_normal_complement gT (S G : {group gT}) :
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 exact: cents1.
+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.
@@ -955,7 +959,7 @@ 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 exact: solvable1.
+ 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.
@@ -1074,7 +1078,7 @@ Lemma p'quo_plength1 G H :
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 exact: pseries_normal.
+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.
@@ -1092,11 +1096,11 @@ 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; exact: pnat_coprime (pcore_pgroup _ _).
+ by apply: coprime_TIg; apply: pnat_coprime (pcore_pgroup _ _).
rewrite setIC subsetI subxx -quotient_sub1.
by rewrite -trO morphim_pcore.
- apply: subset_trans (normal_norm nHG); exact: pcore_sub.
-have nOG: 'O_{p}(G) <| G by exact: pseries_normal.
+ 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.
@@ -1137,26 +1141,24 @@ apply/idP/idP=> [p1G | pU].
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 exact: pseries_normal.
+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 _ #|G : p_elt_gen p G|); last first.
+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.
-apply: indexgS.
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.
-apply: indexgS; rewrite pcore_max ?pcore_pgroup //.
-apply: char_normal_trans nUG; exact: pcore_char.
+by apply: indexgS; rewrite pcore_max ?pcore_pgroup // gFnormal_trans.
Qed.
End Plength1.
@@ -1169,7 +1171,7 @@ 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 exact: p_elt_gen_normal.
+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},
@@ -1183,7 +1185,7 @@ have exB (N : {group gT}) :
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 ->; exact: morph_p_elt.
+ 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.
@@ -1242,7 +1244,7 @@ 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. case: n => [|n]; exact: groupP. Qed.
+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)].
diff --git a/mathcomp/odd_order/BGsection10.v b/mathcomp/odd_order/BGsection10.v
index 88b4c39..f05aeb4 100644
--- a/mathcomp/odd_order/BGsection10.v
+++ b/mathcomp/odd_order/BGsection10.v
@@ -1,9 +1,16 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div path fintype.
+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.
(******************************************************************************)
@@ -143,7 +150,7 @@ 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; exact: alpha_sub_sigma. Qed.
+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.
@@ -291,7 +298,7 @@ have M0tC_M2: M2 \in orbit 'Js 'C(X) (M0 :^ t).
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_transl M0C_M1) (orbit_transr _ M0tC_M2).
+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).
@@ -302,7 +309,7 @@ have pl1L: p.-length_1 L.
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_transr _ (mem_orbit _ _ _)); last first.
+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 //.
@@ -493,7 +500,7 @@ rewrite leq_eqVlt; case: ltngtP => // 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 exact/pElemP.
+ 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 //.
@@ -513,7 +520,7 @@ 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: subset_trans (pcore_sub _ _) (der_norm _ _).
+ exact/gFsub_trans/gFnorm.
by rewrite quotientS1 ?cards1 // Msigma_der1.
Qed.
@@ -527,8 +534,8 @@ Lemma cent1_sigma'_Zgroup P :
exists x,
[/\ x \in 'Ohm_1('Z(P))^#, 'M('C[x]) != [set M] & Zgroup 'C_(M`_\alpha)[x]].
Proof.
-move=> sylP ntP; set T := 'Ohm_1(_); have [sPM pP _] := and3P sylP.
-have [charT nilP] := (char_trans (Ohm_char 1 _) (center_char P), pgroup_nil pP).
+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.
@@ -596,7 +603,7 @@ 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 := char_trans (Ohm_char 1 _) (center_char P).
+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.
@@ -669,7 +676,7 @@ 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] := mmax_exists ltNG; case/setIdP=> /= maxM sNM.
+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.
@@ -833,7 +840,7 @@ 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 ?(subset_trans (pcore_sub _ _)) //.
+rewrite pquotient_pcore ?quotient_pHall 1?gFsub_trans //.
by have [-> _ _] := beta_max_pdiv b'p.
Qed.
@@ -866,7 +873,7 @@ 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[]->; [exact: b'p | exact: 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.
@@ -881,7 +888,7 @@ have{nilM'W} nilW: nilpotent W.
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; exact: (pgroupP (pgroupS sWp'W pqW)).
+ 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.
@@ -892,7 +899,7 @@ have{nilM'W} nilW: nilpotent 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 (subset_trans (pcore_sub _ _)) ?subsetIr //=.
+ 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)).
@@ -906,7 +913,7 @@ have{nilM'W} nilW: nilpotent W.
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 (char_normal_trans (pcore_char _ _)) //= setIC norm_normalI.
+ 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 _).
@@ -929,14 +936,14 @@ 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 (char_normal_trans (pcore_char _ _)) ?quotient_normal ?der_normal.
+ 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 (subset_trans (pcore_sub _ _)) // subsetI sWM normal_norm //=.
+ 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).
@@ -967,7 +974,7 @@ have nMbSM: M`_\beta <*> S <| M.
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 (char_normal_trans (pcore_char _ _)) ?quotient_normal ?der_normal.
+ 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 //.
@@ -1124,8 +1131,8 @@ have{max2A maxQ neq_pq q_dv_CA} [P [sylP sAP] sPNQ']:
have{sNQM} defP: 'O_p(M^`(1)) = P.
rewrite (nilpotent_Hall_pcore nilM' (pHall_subl _ _ sylP)) ?subsetT //.
by rewrite (subset_trans sPNQ') ?dergS.
-have charP: P \char M by rewrite -defP (char_trans (pcore_char p _)) ?der_char.
-have [sPM nsPM] := (char_sub charP, char_normal charP).
+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.
@@ -1135,15 +1142,15 @@ 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 := char_normal_trans (pcore_char _ _) (Fitting_normal 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 ?(subset_trans (pcore_sub _ _)).
+ by rewrite (subset_trans sZM) ?gFnorm ?gFsub_trans.
have{rZle1} cycZ: cyclic Z.
- have nilZ: nilpotent Z := nilpotentS (pcore_sub _ _) Fnil.
+ 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.
@@ -1237,12 +1244,11 @@ do [split; apply: contra neqHgM] => [|nilMs].
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 exact: pcore_normal.
+ 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).
- rewrite (nilpotent_Hall_pcore nilMs sylS).
- by rewrite (char_normal_trans (pcore_char _ _)).
+ 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.
@@ -1275,7 +1281,7 @@ 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; exact: pgroupS pA.
+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.
@@ -1286,7 +1292,7 @@ have ntZ1: Z1 :!=: 1.
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 (subset_trans (Ohm_sub _ _)) ?subsetIr.
+ 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.
@@ -1299,7 +1305,7 @@ have [A1 neqA1Z EpA1]: exists2 A1, A1 != Z1 & #|Z1| = p -> A1 \in E1A.
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; exact/(TIp1ElemP EpZ1).
+ 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].
@@ -1325,7 +1331,7 @@ have [Y [{cplA1C} cycY sZ0Y defC cCC]]: exists Y, cplA1C Y.
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 // (subset_trans (Ohm_sub 1 _)) ?ucn_sub.
+ 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]].
@@ -1389,8 +1395,7 @@ 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 (char_norm_trans (Ohm_char 1 _)) // gFnorm.
+ 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).
@@ -1398,7 +1403,7 @@ have defCPA: 'N_('N_P(A))(A1) = 'C_P(A).
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 (subset_trans (Ohm_sub 1 _)) ?subsetIr.
+ 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 _))) //.
@@ -1407,7 +1412,7 @@ have defCPA: 'N_('N_P(A))(A1) = 'C_P(A).
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 -{2}defCPA1 setIS // (char_norm_trans (Ohm_char 1 _)).
+ 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 //.
@@ -1481,7 +1486,7 @@ have ntX: X != 1.
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 := subset_trans (pcore_sub q Y) sYM.
+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].
diff --git a/mathcomp/odd_order/BGsection11.v b/mathcomp/odd_order/BGsection11.v
index 6fccf96..be228fc 100644
--- a/mathcomp/odd_order/BGsection11.v
+++ b/mathcomp/odd_order/BGsection11.v
@@ -1,9 +1,16 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div path fintype.
+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.
(******************************************************************************)
@@ -256,8 +263,7 @@ 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 _) //.
- rewrite (subsetP (char_norm_trans (Ohm_char 1 _) _) g nPg) //.
- by rewrite char_norms ?center_char.
+ 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.
@@ -308,7 +314,7 @@ 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_transl g1Mg2).
+ 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.
@@ -364,26 +370,25 @@ have [cKA | not_cKA]:= boolP (A \subset 'C(K)).
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.
- rewrite quotient_normal // -defA (char_normal_trans (Ohm_char _ _)) //.
- by rewrite (char_normal_trans (pcore_char p _)).
+ 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 => //; exact: (pgroup_sol pA).
+ 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 => ->; exact: cents1.
+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.
-have [regQ | nregQ] := eqVneq 'C_Q(A) 1; last first.
+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) //.
@@ -408,31 +413,30 @@ have [regQ | nregQ] := eqVneq 'C_Q(A) 1; last first.
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 charQ0: Q0 \char Q := center_char Q.
-have nQ0A: A \subset 'N(Q0) := char_norm_trans charQ0 nQA.
+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) ?center_abelian //.
- by rewrite setIAC regQ (setIidPl (sub1G _)) dprodg1 commGC.
- by rewrite (coprimeSg (subset_trans (center_sub Q) sQK)).
+ 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 nsQ0M: Q0 <| M.
- have sQ0M: Q0 \subset M := subset_trans (center_sub Q) (pHall_sub sylQ_M).
- have qQ0: q.-group Q0 := pgroupS (center_sub Q) 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 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].
-case/exists_inP: sM'q; exists Q => //.
-rewrite (subset_trans (char_norms charQ0)) ?(mmax_normal maxM nsQ0M) //= -/Q0.
-by apply: contraNneq ntQ; move/(trivg_center_pgroup qQ)->.
+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
index b831ebc..e392285 100644
--- a/mathcomp/odd_order/BGsection12.v
+++ b/mathcomp/odd_order/BGsection12.v
@@ -1,9 +1,16 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq choice div fintype.
+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.
(******************************************************************************)
@@ -97,7 +104,7 @@ 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; exact: Hall_exists. Qed.
+Proof. by split; apply: Hall_exists. Qed.
Lemma ex_tau2_compl E1 E3 :
\tau1(M).-Hall(E) E1 -> \tau3(M).-Hall(E) E3 ->
@@ -228,7 +235,7 @@ 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; exact: sigma'_rank2_max.
+by apply/subsetP; apply: sigma'_rank2_max.
Qed.
End Introduction.
@@ -262,8 +269,7 @@ have cycE1: cyclic 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.
- exact: char_normal_trans (pcore_char _ _) (der_normal _ _).
+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.
@@ -276,18 +282,17 @@ have SylowE3 P: Sylow E3 P -> [/\ cyclic P, P \subset E^`(1) & 'C_P(E) = 1].
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 exact: gFnorm.
+ 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 //=; last first.
- by rewrite (subset_trans (der_sub 1 E)).
+ 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 /=.
+ 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.
@@ -295,8 +300,7 @@ have SylowE3 P: Sylow E3 P -> [/\ cyclic P, P \subset E^`(1) & 'C_P(E) = 1].
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.
- rewrite subsetI in sKNEP; case/andP: sKNEP => sKE nPK.
- have nEp'K := subset_trans sKE nEp'E.
+ 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.
@@ -412,8 +416,8 @@ 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; exact: subset_trans (centS sA0A).
-have nsHsH: H`_\sigma <| H by exact: pcore_normal.
+ 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)).
@@ -439,14 +443,14 @@ have [sMp | sM'p] := boolP (p \in \sigma(M)).
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 => // -> _ _; exact: subsetIl.
+ 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=> //; exact/pnElemP.
- have maxAM: M \in 'M(A) by exact/setIdP.
+ 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.
@@ -520,9 +524,9 @@ have{EpAnonuniq} sCMkApCA y: y \in A^# ->
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.
- rewrite !{1}subsetI !{1}(subset_trans (subsetIl _ _) (pcore_sub _ _)).
- by split=> // [/cAMs | /cAMa]; rewrite centsC; apply: subset_trans;
- rewrite setIS ?(subset_trans (cent_sub Y)).
+ 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.
@@ -556,7 +560,7 @@ have rPle2: 'r(P) <= 2.
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) // (subset_trans (Ohm_sub 1 _)) ?subsetIr.
+ 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).
@@ -575,12 +579,11 @@ have Ma1: M`_\alpha = 1.
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) //.
-apply: char_normal_trans (char_trans (Ohm_char 1 _) (center_char P)) _.
+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) ?(char_normal_trans (pcore_char _ _)).
+by rewrite (nilpotent_Hall_pcore _ sylP) ?gFnormal_trans.
Qed.
(* This is B & G, Theorem 12.5(a) -- this part does not mention a specific *)
@@ -634,8 +637,7 @@ 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).
- rewrite (nilpotent_Hall_pcore nilHs sylP_Hs).
- by rewrite !(char_norm_trans (pcore_char _ _)) ?normG.
+ 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 //.
@@ -670,7 +672,7 @@ have sAsylE P: p.-Sylow(E) P -> 'Ohm_1(P) = A /\ ~~ ('N(P) \subset M).
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 (char_norms (Ohm_char 1 P))).
+ 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=> //.
@@ -798,7 +800,7 @@ have def_t2: \tau2(M) =i (p : nat_pred).
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 exact: pnat_coprime qB (pi_pnat pA _).
+ 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).
@@ -819,7 +821,7 @@ have def_t2: \tau2(M) =i (p : nat_pred).
rewrite (card_Hall sylS) -(card_Hall sylP1).
by rewrite (card_Hall sylP_E) -(card_Hall sylP1_E).
have coMsA: coprime #|Ms| #|A|.
- by exact: pnat_coprime (pcore_pgroup _ _) (pi_pnat pA _).
+ 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.
@@ -843,7 +845,7 @@ 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 => _; exact: subset_trans 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 _.
@@ -906,8 +908,7 @@ have defFM: Ms \x A0 = 'F(M).
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 first.
- exact: subset_trans (pcore_sub _ _) (Fitting_sub _).
+ 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.
@@ -919,8 +920,8 @@ have defFM: Ms \x A0 = 'F(M).
apply/implyP; rewrite implyNb /= -def_t2 orbC.
by rewrite (prime_class_mmax_norm maxM qQ).
rewrite pcore_max ?(pi_p'group (pcore_pgroup _ _)) //.
- rewrite /normal (subset_trans (Fitting_sub M)) ?gFnorm //.
- rewrite Fitting_max ?pcore_normal ?(tau2_Msigma_nil _ t2Mp) //.
+ 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 //.
@@ -1021,7 +1022,7 @@ 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 (char_normal_trans (Fitting_char _)) // /normal sCH norms_cent.
+ 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.
@@ -1043,7 +1044,7 @@ 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) => // _ [// |<- _] _ _ _ _; exact: char_norms (Ohm_char 1 _).
+ 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)).
@@ -1125,8 +1126,7 @@ 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.
- rewrite (nilpotent_Hall_pcore nilF hallE2_F).
- exact: char_normal_trans (pcore_char _ _) (Fitting_normal E).
+ 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.
@@ -1227,7 +1227,7 @@ 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 exact/commG1P.
+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.
@@ -1379,7 +1379,7 @@ have [cSS | not_cSS] := boolP (abelian S).
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; exact: pgroup_nil t2E2.
+by rewrite (eq_pgroup _ def_t2) in t2E2; apply: pgroup_nil t2E2.
Qed.
(* This is B & G, Corollary 12.10(c). *)
@@ -1477,7 +1477,7 @@ Lemma primes_norm_tau2Elem M E p A Mstar :
Proof.
move=> maxM hallE t2Mp Ep2A; move: Mstar.
have [sAE abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
-have ntA: A :!=: 1 by exact: (nt_pnElem Ep2A).
+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).
@@ -1553,7 +1553,7 @@ have part_b H:
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 -quotient_cents2 ?(subset_trans _ (gFnorm _ _)) // centsC.
+ 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.
@@ -1848,7 +1848,7 @@ have not_sNS_M: ~~ ('N(S) \subset M).
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 := subset_trans (Ohm_sub 1 Z) sZS.
+ 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)).
@@ -1867,7 +1867,7 @@ have [cSU | not_cSU] := boolP (U \subset 'C(S)).
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/(subsetP sSZ)=> ZUz; rewrite sub_center_normal ?cycle_subG.
+ 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.
@@ -1937,7 +1937,7 @@ have ltQ01: Q0 \proper Q1.
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 exact: quotient_pgroup.
+ 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).
@@ -1951,7 +1951,7 @@ have [X]: exists2 X, X \in subgroups Q & ('C_S(X) != 1) && ([~: S, X] != 1).
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 exact: quotient_norms.
+ 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.
@@ -1959,7 +1959,7 @@ have [X]: exists2 X, X \in subgroups Q & ('C_S(X) != 1) && ([~: S, X] != 1).
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 := subset_trans (Ohm_sub 1 Q) nQ0Q.
+ 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 //.
@@ -1977,17 +1977,16 @@ have [X]: exists2 X, X \in subgroups Q & ('C_S(X) != 1) && ([~: S, X] != 1).
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) (normsP (normal_norm (center_normal E))) //.
+ 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.
+ apply: regE1subZ; rewrite /= -/Q11x.
apply/nElemP; exists q; rewrite p1ElemE // !inE oQ11x.
by rewrite (subset_trans _ sQ1xE1) //= conjSg Ohm_sub.
- have: cyclic Q11x by rewrite prime_cyclic ?oQ11x.
- case/cyclicP=> y defQ11x; rewrite /= -/Q11x defQ11x cent_cycle regU13 //.
+ 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 //.
- rewrite sub_conjg (subset_trans (Ohm_sub 1 Q1)) //.
- by rewrite (normsP (normal_norm nsUE)) ?groupV.
+ 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.
@@ -2067,7 +2066,7 @@ have defZ: 'Ohm_1 ('Z(P)) = Z.
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 exact/p_rank_geP.
+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] _ | _ -> //].
@@ -2153,7 +2152,7 @@ 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 exact: Msigma_Hall.
+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.
@@ -2178,7 +2177,7 @@ 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; exact/sdprod_Hall_p'coreP.
+ 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).
@@ -2198,7 +2197,7 @@ have sXZ: X \subset 'Z(P).
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) => _ <- _; exact: mulG_subl.
+ 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) //.
@@ -2376,7 +2375,7 @@ without loss sXMs: M maxM sM_Y sMq / X \subset M`_\sigma.
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_transl (mem_orbit _ _ _)) //; apply.
+ 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.
@@ -2456,10 +2455,9 @@ 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)).
- have sder := subset_trans (der_sub 1 _).
- rewrite -norm_joinEr ?sder //; apply: pgroupS => /=.
- rewrite norm_joinEr -?quotientSK ?sder //= !quotient_der //.
- by rewrite -{1}defL quotientMidl.
+ 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.
@@ -2641,9 +2639,8 @@ have sQM': Q \subset M^`(1).
have ntMa: Ma != 1.
apply: contraNneq nonuniqNQ => Ma1.
rewrite (mmax_normal maxM _ ntQ) ?mmax_sup_id //.
- apply: char_normal_trans (der_normal 1 M).
have sylQ_M': q.-Sylow(M^`(1)) Q := pHall_subl sQM' (der_sub 1 M) sylQ.
- rewrite (nilpotent_Hall_pcore _ sylQ_M') ?pcore_char //.
+ 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.
diff --git a/mathcomp/odd_order/BGsection13.v b/mathcomp/odd_order/BGsection13.v
index be68f9d..f5e3a9c 100644
--- a/mathcomp/odd_order/BGsection13.v
+++ b/mathcomp/odd_order/BGsection13.v
@@ -1,9 +1,16 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div path fintype.
+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.
(******************************************************************************)
@@ -54,9 +61,9 @@ 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 //.
- rewrite (char_normal_trans _ (der_normal 1 _)) //= -quotient_der //.
- rewrite (nilpotent_Hall_pcore _ (quotient_pHall nHbY sylY)) ?pcore_char //.
- exact: Mbeta_quo_nil.
+ 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).
@@ -102,10 +109,10 @@ split=> // [P sPMH pP | t1Mp]; last first.
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 -{2}(quotientGK nsHaH) -quotientYK ?cosetpre_normal //.
- rewrite (char_normal_trans _ (der_normal 1 _)) //= -quotient_der //.
- rewrite (nilpotent_Hall_pcore _ (quotient_pHall nHaS sylS_H')) ?pcore_char //.
- exact: Malpha_quo_nil.
+ 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 _.
@@ -246,7 +253,7 @@ 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 exact: nt_pnElem EpP _.
+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.
@@ -349,7 +356,7 @@ 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; exact: cyclicS cycS.
+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.
@@ -676,9 +683,8 @@ suffices sXL: X \subset L.
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.
- rewrite (char_norm_trans (pcore_char _ _)) ?quotient_norms //.
- by rewrite (subset_trans sXL) ?der_norm.
+ 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.
@@ -696,10 +702,10 @@ 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 //.
- rewrite (eq_Hall_pcore (nilpotent_pcore_Hall q (Mbeta_quo_nil _))) //.
- apply: char_normal_trans (pcore_char _ _) (quotient_normal _ _).
- exact: der_normal.
- rewrite quotient_pHall // (pHall_subl _ (der_sub 1 M) sylQ) //.
+ 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.
@@ -727,7 +733,7 @@ have{not_pM'} [R ErR nQR]: exists2 R, R \in 'E_r^1('C_M(P)) & R \subset 'N(Q).
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; exact: beta_sub_sigma.
+ 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).
@@ -774,7 +780,7 @@ without loss sylS_L: L maxL sLq notMGL / q.-Sylow(L) S.
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_transr _ (mem_orbit 'Js L Gx)).
+ 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.
@@ -1104,7 +1110,7 @@ have defP: 'C_A(Q) = P.
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 exact/pnElemP.
+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).
diff --git a/mathcomp/odd_order/BGsection14.v b/mathcomp/odd_order/BGsection14.v
index 493f634..3414af3 100644
--- a/mathcomp/odd_order/BGsection14.v
+++ b/mathcomp/odd_order/BGsection14.v
@@ -1,10 +1,18 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div path fintype.
+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.
(******************************************************************************)
@@ -428,7 +436,7 @@ have [ntS cycS]: S :!=: 1 /\ cyclic S.
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 := subset_trans (Ohm_sub 1 S) sSM.
+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 /=.
@@ -448,7 +456,7 @@ move=> notP1maxM; suffices [maxM]: M \in 'M /\ ~~ \sigma_kappa(M).-group M.
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[]; exact: (pnatPpi k'M).
+by apply: sub_in_pnat => p piMp /orP[] // /idPn[]; apply: (pnatPpi k'M).
Qed.
(* This is B & G, Proposition 14.2. *)
@@ -592,7 +600,7 @@ have [have_a nK1K ntE1 sE1K]: [/\ part_a, b1_hyp, E1 :!=: 1 & E1 \subset K].
by rewrite setIS ?centS.
have defM := sdprod_sigma maxM hallE.
rewrite /b1_hyp -defK; split=> //; exists 1%G; last first.
- by split; [exact: abelian1 | rewrite -defK | exact: semiregular1l].
+ 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.
@@ -706,9 +714,9 @@ have [regMsU nilMs]: 'C_Ms(U) = 1 /\ nilpotent Ms.
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.
- rewrite -(setIidPr (centS (subset_trans (Ohm_sub 1 S) sSU))) setIA.
- have [|_ _ -> ->] := sigma'_kappa'_facts maxM sylS_M; last by rewrite setI1g.
- by rewrite -negb_or (piSg sUM).
+ 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).
@@ -834,7 +842,7 @@ have kp: p \in \kappa(M).
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; exact: (pnatPpi k'M).
+ 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.
@@ -931,7 +939,7 @@ 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; exact/andP.
+ 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)).
@@ -1155,7 +1163,7 @@ have tiP: trivIset P.
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; exact: mem_imset2.
+ 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.
@@ -1646,7 +1654,7 @@ have [Mi MXi P2maxMi]: exists2 Mi, Mi \in MX & Mi \in 'M_'P2.
have [[PmaxMi _] [PmaxMj _]] := (PmaxMX _ MXi, PmaxMX _ MXj).
have [[maxMi _] [maxMj _]] := (setDP PmaxMi, setDP PmaxMj).
apply: sigma_support_disjoint; rewrite ?mmaxJ //.
- rewrite (orbit_transr _ (mem_orbit _ _ _)) ?inE //=.
+ 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 //.
@@ -1884,7 +1892,7 @@ 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_transr _ (mem_orbit _ _ _)) ?inE //; exact.
+ 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.
@@ -1962,8 +1970,8 @@ have tiPcover: trivIset Pcover.
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_transr _ (mem_orbit _ _ Ga)).
- rewrite {b Gb}(orbit_transl (mem_orbit _ _ Gb))=> /imsetP[c Gc ->] /=.
+ 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.
@@ -2174,11 +2182,11 @@ 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)) //.
- rewrite (mmax_normal maxM) ?(char_normal_trans (pcore_char _ _)) //.
- by rewrite -rank_gt0 (rank_Sylow sylKp) p_rank_gt0.
+ by rewrite (mmax_normal maxM) ?gFnormal_trans.
have [A EpA _] := ex_tau2Elem hallE t2Mp.
-have [sAE] := pnElemP EpA; case/andP=> pA _ dimA.
+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.
@@ -2288,8 +2296,8 @@ have snK_sMst L: K <|<| L -> L \subset Mst.
apply/subsetP=> a Aa; rewrite -groupV sK_uniqMst // (subset_trans sKL) //.
by rewrite -sub_conjg (normsP (normal_norm nsLA)).
have sEH: E \subset H.
- apply: subset_trans (char_norm_trans _ (normal_norm nsUE)) sNRH.
- by rewrite (nilpotent_Hall_pcore (abelian_nil cUU) sylR) pcore_char.
+ 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].
@@ -2332,7 +2340,7 @@ have defUK: [~: U, K] = U.
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 := subset_trans (pcore_sub q D) nHsD.
+ 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.
@@ -2347,16 +2355,14 @@ have sUHs: U \subset H`_\sigma.
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) //.
- rewrite p'groupEpi; apply: (contraL (pnatPpi sk'M_U)) => /=.
- by rewrite inE /= orbC (pnatPpi kK).
- exact: normalS (joing_subl _ _) _ (pcore_normal _ _).
+ 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 := subset_trans (Ohm_sub 1 R) (pHall_sub sylR).
+ 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).
@@ -2371,7 +2377,7 @@ suffices ->: H :&: Mst = D.
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 := char_normal_trans (pcore_char _ _) (Fitting_normal _).
+ 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.
diff --git a/mathcomp/odd_order/BGsection15.v b/mathcomp/odd_order/BGsection15.v
index 2238534..c3e8004 100644
--- a/mathcomp/odd_order/BGsection15.v
+++ b/mathcomp/odd_order/BGsection15.v
@@ -1,10 +1,18 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq choice div fintype.
+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.
(******************************************************************************)
@@ -71,7 +79,7 @@ rewrite -(nilpotent_Fitting nilH) FittingEgen genS //.
apply/bigcupsP=> [[p /= _] piHp]; rewrite (bigcup_max 'O_p(H)%G) //.
have sylHp := nilpotent_pcore_Hall p nilH.
have sylHp_M := subHall_Sylow hallH (pnatPpi pi_H piHp) sylHp.
-by rewrite (p_Sylow sylHp_M) (char_normal_trans (pcore_char _ _)).
+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.
@@ -384,7 +392,7 @@ have{sMsM'} sKsQ: Ks \subset Q.
apply/eqP; rewrite eqEsubset Fitting_sub /= -{1}defMsK.
rewrite (odd_sdprod_primact_commg_sub_Fitting defM) ?mFT_odd //.
apply/trivgP; rewrite -tiKsFM setIAC setSI //= -/Ms subsetI Fitting_sub /=.
- by rewrite Fitting_max ?Fitting_nil // (char_normal_trans (Fitting_char _)).
+ 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 _ _)).
@@ -436,7 +444,7 @@ have{K1 sK1M sK1K coMsK1 coQK1 prK1 defCMsK1 nQK1 solMs} Qi_rec Qi:
case/subsetIP=> sLM nQij nLN; exists L.
have{sLbQ} sLQ: L \subset Q by rewrite -(quotientSGK nQij sQiQ) -defLb.
rewrite inE /psubgroup /normal sLQ sQij nQij (pgroupS sLQ qQ) -defLb.
- have nLDK: D <*> K \subset 'N(L) by apply: subset_trans nLN; exact/subsetIP.
+ have 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).
@@ -490,7 +498,7 @@ have nsQ0M: Q0 <| M by rewrite /normal subIset ?sQM.
have sFM_QCQ: 'F(M) \subset Q <*> 'C_M(Q).
have [_ /= mulQQ' cQQ' _] := dprodP (nilpotent_pcoreC q (Fitting_nil M)).
rewrite -{3}mulQQ' p_core_Fitting cent_joinEr ?subsetIr //= -/Q in cQQ' *.
- by rewrite mulgS // subsetI (subset_trans (pcore_sub _ _) (Fitting_sub M)).
+ 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 //=.
@@ -688,10 +696,8 @@ have nsMsM: M`_\sigma <| M := pcore_normal _ _; have [sMsM _] := andP nsMsM.
have [nsHM | not_nsHM] := boolP (H <| M).
by exists b; rewrite // (mmax_normal maxM) ?setIid.
have neqMFs: M`_\F != M`_\sigma.
- apply: contraNneq not_nsHM => eq_MF_Ms.
- have nilMs: nilpotent M`_\sigma by apply/Fcore_eq_Msigma.
- rewrite (eq_Hall_pcore (nilpotent_pcore_Hall _ nilMs) hallH).
- exact: char_normal_trans (pcore_char _ _) nsMsM.
+ 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)).
@@ -707,11 +713,10 @@ have [_ mulQD nQD tiQD] := sdprodP defMs; rewrite -/Q in mulQD nQD tiQD.
have nQH := subset_trans sHMs (normal_norm nsQ_Ms).
have nsQHM: Q <*> H <| M.
rewrite -(quotientGK nsQM) -quotientYK // cosetpre_normal //= -/Q.
- have nilMsQ: nilpotent (M`_\sigma / Q).
- by rewrite -mulQD quotientMidl -(isog_nil (quotient_isog _ _)).
- have hallMsQpi := nilpotent_pcore_Hall pi nilMsQ.
- rewrite (eq_Hall_pcore hallMsQpi (quotient_pHall nQH hallH)).
- by rewrite (char_normal_trans (pcore_char _ _)) ?quotient_normal.
+ 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.
@@ -720,9 +725,9 @@ have defM: Q * 'N_M(H) = M.
have hallH_QH: pi.-Hall(Q <*> H) H.
by rewrite (pHall_subl (joing_subr _ _) _ hallH) // join_subG sQMs.
have solQH := solvableS (normal_sub nsQHM) (mmax_sol maxM).
- rewrite -{2}(Hall_Frattini_arg solQH nsQHM hallH_QH) /= norm_joinEr //.
+ rewrite -[RHS](Hall_Frattini_arg solQH nsQHM hallH_QH) /= norm_joinEr //.
by rewrite -mulgA [H * _]mulSGid // subsetI (subset_trans sHMs sMsM) normG.
-move: Mb; rewrite -{1}defM; case/mulsgP=> z n Qz Nn defb; exists n => //.
+rewrite -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.
@@ -805,7 +810,7 @@ have defF: 'F(M`_\sigma) \x Y = 'F(M).
rewrite Fitting_max ?(nilpotentS (pcore_sub _ _)) //=.
by rewrite -(pcore_setI_normal _ nsFM) norm_normalI ?(subset_trans sMsM).
rewrite /normal (char_norm_trans (Fitting_char _)) ?(subset_trans sFM) //.
- by rewrite Fitting_max ?Fitting_nil // (char_normal_trans (Fitting_char _)).
+ 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.
@@ -815,7 +820,7 @@ have hallX: \sigma(M)^'.-Hall('C_M(H)) X.
by apply: sub_pgroup t2X => p /andP[].
have sYX: Y \subset X.
rewrite (normal_sub_max_pgroup (Hall_max hallX)) ?pcore_pgroup //.
- rewrite /normal (char_norm_trans (pcore_char _ _)) ?subIset ?nFM //= -/Y.
+ 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 _ _).
@@ -826,25 +831,25 @@ have [U complU] := ex_kappa_compl maxM hallK.
have [[defM _ cM'M'b] defM' _ _ _] := kappa_structure maxM complU.
have d_holds: M \in 'M_'P -> 'F(M) \subset M^`(1).
rewrite inE maxM andbT -(trivg_kappa maxM hallK) => ntK.
- rewrite -(dprodW defF) mulG_subG (subset_trans (Fitting_sub _)) //= -/Y.
+ 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.
- by case/andP=> _; apply: contraL => /rank_kappa->.
+ 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 (subset_trans (pcore_sub _ _)).
+ 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) ?(char_normal_trans (pcore_char _ _)) //.
+ 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).
@@ -1138,9 +1143,7 @@ have cycHp': cyclic 'O_p^'(H).
by rewrite subsetI pcore_sub.
rewrite {1}defX oX1 /= -[M`_\F]/(gval H) -/P; split=> //.
pose Z q := 'Ohm_1('Z('O_q(H)))%G.
-have charZ q: Z q \char H.
- have:= char_trans (center_char _) (pcore_char q H).
- exact: char_trans (Ohm_char 1 _).
+have 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.
@@ -1190,10 +1193,10 @@ have [K_dv_p1 | {regZq_dv_q1}] := altP (@implyP (Ks :==: Z0) (#|K| %| p.-1)).
apply: contra neqZqKs => sKsZq; rewrite eqEsubset sKsZq /=.
by rewrite prime_meetG ?oZ // (setIidPr sKsZq).
rewrite {Z oZ charZ}negb_imply; case/andP; move/eqP=> defKs not_K_dv_p1.
-have nPK: K \subset 'N(P) := char_norm_trans (pcore_char p H) nHK.
+have 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)) := char_norm_trans (center_char _) nPK.
+ 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.
@@ -1217,7 +1220,7 @@ have rPle2: 'r(P) <= 2.
by rewrite inE Ep2B (subsetP (pmaxElemS p (subsetT P))) // inE pmaxB inE.
have [x defK] := cyclicP cycK; have Kx: x \in K by rewrite defK cycle_id.
have nPx := subsetP nPK x Kx; rewrite /A defK morphim_cycle //.
- have Axj: conj_aut [group of P] x \in A by exact: mem_morphim.
+ have 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.
@@ -1279,9 +1282,9 @@ have{not_t2'H} [q1 t2Hq neq_q]: exists2 q1, q1 \in \tau2(H) & q1 = q -> uniq_q.
by rewrite (partition_pi_mmax maxH) t2q1 !orbT.
have [all_q | ] := altP (@allP _ (pred1 q) s); last first.
by case/allPn=> q1; rewrite mem_s=> t2q1; move/eqnP=> ne_q1q; exists q1.
- have s_q1: head q s \in s by case: (s) nts => // q1 s' _; exact: predU1l.
+ 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; [exact: all_q | move/eqnP->; rewrite -def_q].
+ 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.
@@ -1305,9 +1308,9 @@ have sLq: q \in \sigma(L).
by rewrite -pnatE // -pgroupE (pgroupS sKLs) ?pcore_pgroup.
have sLq1: q1 \in \sigma(L).
apply: contraLR sLq => s'Lq1; rewrite -negnK negbK /= -pnatE // -pgroupE.
- have s'LA: \sigma(L)^'.-group A by exact: pi_pgroup qA _.
+ have 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 exact/pnElemP.
+ 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.
@@ -1455,7 +1458,7 @@ have FmaxM: M \in 'M_'F; last split=> //.
have nilMs: nilpotent M`_\sigma by rewrite notP1type_Msigma_nil ?FmaxM.
have sMsF: M`_\sigma \subset 'F(M) by rewrite Fitting_max ?pcore_normal.
have defR: R :=: 'O_r(U) := nilpotent_Hall_pcore (abelian_nil cUU) sylR_U.
-have nRK: K \subset 'N(R) by rewrite defR (char_norm_trans (pcore_char r U)).
+have 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.
diff --git a/mathcomp/odd_order/BGsection16.v b/mathcomp/odd_order/BGsection16.v
index a37edba..8aed3eb 100644
--- a/mathcomp/odd_order/BGsection16.v
+++ b/mathcomp/odd_order/BGsection16.v
@@ -1,10 +1,18 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div path fintype.
+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.
(******************************************************************************)
@@ -175,7 +183,7 @@ Proof. by rewrite /FTtype; do 4!case: ifP => // _. Qed.
Definition FTcore M := if 0 < FTtype M <= 2 then M`_\F else M^`(1).
Fact FTcore_is_group M : group_set (FTcore M).
-Proof. rewrite /FTcore; case: ifP => _; exact: groupP. Qed.
+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)^#.
@@ -617,7 +625,7 @@ split.
have{sylS} sylS := subHall_Sylow hallU sk'p sylS.
have [[sSM pS _] [/= s'p _]] := (and3P sylS, norP sk'p).
rewrite (sigma'_nil_abelian maxM) ?(pi_pgroup pS) ?(pgroup_nil pS) //.
- rewrite (rank_Sylow sylS) leqNgt (contra _ s'p) //; exact: alpha_sub_sigma.
+ 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.
@@ -770,7 +778,7 @@ split; last 1 first.
rewrite -[Z](defCK _ K1ya) inE groupJ // cent1C -consttJ groupX ?cent1id //.
by rewrite (contra (mem_p_elt su'K)) ?(contra (mem_p_elt suKs)) ?p_eltJ.
rewrite (trivg_kappa_compl maxM complU) => notP1maxM.
-have P2maxM: M \in 'M_'P2 by exact/setDP.
+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.
@@ -1070,7 +1078,7 @@ have [K1 | ntK] := eqsVneq K 1.
by have [_] := kappa_compl_context maxM complU; rewrite defH K1 sdprodg1.
exists U; split.
have [_ _ _ cU1U1 exU0] := kappa_structure maxM complU.
- split=> //; last by rewrite -/Ms -defH in exU0; exact: exU0.
+ 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.
@@ -1093,7 +1101,7 @@ have [K1 | ntK] := eqsVneq K 1.
have [_ <- nHU tiHU] := sdprodP defM.
by rewrite quotientMidl -(exponent_isog (quotient_isog _ _)).
have sylP: p.-Sylow(H) P := nilpotent_pcore_Hall _ (Fcore_nil M).
- have ntP: P != 1 by apply: contraNneq not_cPP => ->; exact: abelian1.
+ 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.
@@ -1131,7 +1139,7 @@ have [Ueq1 | ntU] := eqsVneq U 1; last first.
apply/eqP; rewrite eqEsubset (Fcore_max hallH_M') ?Fcore_nil // andbT.
rewrite (Fcore_max (subHall_Hall hallM' _ (Fcore_Hall _))) ?Fcore_nil //.
by move=> p piM'Fp; apply: pnatPpi k'M' (piSg (Fcore_sub _) piM'Fp).
- exact: char_normal_trans (Fcore_char _) nsM'M.
+ 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.
@@ -1165,7 +1173,7 @@ have [_ _ _ _] := nonTI_Fitting_structure maxM notMy ntX.
case=> [[] | [_]]; first by case/idPn; case/setDP: PmaxM.
move: #|_| => p; set P := 'O_p(H); rewrite /= -/H => not_cPP cycHp'.
have sylP: p.-Sylow(H) P := nilpotent_pcore_Hall _ (Fcore_nil M).
-have ntP: P != 1 by apply: contraNneq not_cPP => ->; exact: abelian1.
+have 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.
@@ -1200,7 +1208,7 @@ split=> [H x a hallH nilH Hx|].
have [allFM | ] := boolP (('M : {set {group gT}}) \subset 'M_'F).
by left=> M maxM; rewrite -FTtype_Fmax // (subsetP allFM).
case/subsetPn=> S maxS notFmaxS; right.
-have PmaxS: S \in 'M_'P by exact/setDP.
+have 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 _.
@@ -1263,7 +1271,7 @@ without loss {defX} ->: X / X = 'A0(M).
set D0 := finset _ => [[sD0A1 tameA0 signD0]] D.
have sDD0: D \subset D0 by rewrite /D /D0 !setIdE setSI.
split=> [|x Ax a Axa|x Dx]; first exact: subset_trans sDD0 sD0A1.
- by apply: tameA0; exact: (subsetP sAA0).
+ 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.
@@ -1291,7 +1299,7 @@ have tiA0 x a: x \in 'A0(M) :\: 'A1(M) -> x ^ a \in 'A0(M) -> a \in M.
have sDA1: D \subset 'A1(M).
apply/subsetPn=> [[x /setIdP[A0x not_sCxM] notA1x]].
case/subsetP: not_sCxM => a cxa.
- by apply: (tiA0 x); [exact/setDP | rewrite /conjg -(cent1P cxa) mulKg].
+ 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].
@@ -1318,7 +1326,7 @@ have MSx_gt1: #|'M_\sigma[x]| > 1.
by apply: contra not_sCxM; move/cent1_sub_uniq_sigma_mmax->.
have [FmaxM t2'M]: M \in 'M_'F /\ \tau2(M)^'.-group M.
apply: (non_disjoint_signalizer_Frobenius ell1x MSx_gt1 SMxM).
- by apply: contra not_sNx'CMy; exact: pgroupS (subsetIl _ _).
+ 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.
diff --git a/mathcomp/odd_order/BGsection2.v b/mathcomp/odd_order/BGsection2.v
index fc5f489..5faf8ca 100644
--- a/mathcomp/odd_order/BGsection2.v
+++ b/mathcomp/odd_order/BGsection2.v
@@ -1,11 +1,19 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div fintype.
+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.
Require poly ssrint.
+From mathcomp
Require Import matrix mxalgebra mxrepresentation mxabelem.
+From mathcomp
Require Import BGsection1.
(******************************************************************************)
@@ -62,8 +70,7 @@ have absM f: (M *m f <= M)%MS -> {a | (a \in E_H)%MS & M *m a = M *m f}.
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.
- suffices: mx_absolutely_irreducible rM by case/andP.
- by apply: closedF; exact/submod_mx_irr.
+ 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.
@@ -108,7 +115,7 @@ have{cHtau_x} cGtau_x: centgmx rG (tau *m rG x).
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; exact: closedF.
+ 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 //=.
@@ -137,41 +144,40 @@ 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)).
- by apply: closF; exact/submod_mx_irr.
+ 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 exact: socle_exists.
+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''; exact: orbit_in_trans.
+ 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)) _.
- apply/subsetP=> z; rewrite !inE => /andP[->]; apply: subset_trans.
- exact: subsetT.
+ 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; exact: dvdn_trans (cardSg sHG).
+ 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 exact: Clifford_simple.
+ 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; exact: component_mx_iso.
+ 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.
@@ -238,7 +244,7 @@ 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); exact: eqP.
+by rewrite (can_eq mxvecK); apply: eqP.
Qed.
Let E2iP i t e :
@@ -260,7 +266,7 @@ 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); exact: primitive_root_splitting_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.
@@ -290,7 +296,7 @@ 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 exact: nz_row_mxsimple 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.
@@ -302,7 +308,7 @@ 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; exact/eigenspaceP.
+by rewrite defMi (sumsmx_sup k) // /V_ -def_a; apply/eigenspaceP.
Qed.
(* This is B & G, Proposition 2.4(b). *)
@@ -431,7 +437,7 @@ have /mxdirect_sumsE[/= dx_diag rank_diag]: mxdirect sum_diagE.
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 _ _; exact: inj_eps.
+ 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.
@@ -457,7 +463,7 @@ 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; exact/eqP/andP.
+by rewrite !inE /= (modn_small (valP t)) => def_t; apply/eqP/andP.
Qed.
(* This is B & G, Proposition 2.4(h). *)
@@ -610,7 +616,7 @@ 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 := char_normal_trans (center_char _) nsPG.
+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 //=.
@@ -618,8 +624,8 @@ have defCP: 'C_G(P) = 'Z(P).
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 exact: pgroupS sPG F'G.
-have F'H: [char F]^'.-group H by exact: pgroupS sHG F'G.
+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)).
@@ -633,7 +639,7 @@ wlog{ffulG F'G} [irrG regZ]: q rG / mx_irreducible rG /\ rfix_mx rG 'Z(P) = 0.
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 exact/submod_mx_irr.
+ 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->.
@@ -662,7 +668,7 @@ have{M simM irrG regZ F'P} [irrP def_q]: mx_irreducible rP /\ q = (p ^ n)%N.
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 => _; exact.
+ 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).
@@ -742,11 +748,11 @@ have mulBg x: x \in P -> B x *m gE = yr *m B x.
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 exact: socle_exists.
+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; exact: 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).
@@ -767,7 +773,7 @@ have{yr Wi_yr Pb mulBg} sB1E i: (B1 i <= E_ i)%MS.
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 exact: onW_bij.
+ 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^#|.
@@ -833,7 +839,7 @@ 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; exact: IH ffulG closFc.
+ 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.
@@ -852,7 +858,7 @@ have nPG: G \subset 'N(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 exact: gFnorm.
+ 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).
@@ -881,7 +887,7 @@ have{IHm} abelQ: abelian Q.
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 exact: (mxsimple_abelian_linear (closF _)) simU.
+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.
@@ -1024,7 +1030,7 @@ have [v defUc]: exists u : 'rV_2, (u :=: U^C)%MS.
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 exact: rfix_mx_module.
+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) => //.
@@ -1064,7 +1070,7 @@ 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 exact: abelem_mx_faithful.
+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.
diff --git a/mathcomp/odd_order/BGsection3.v b/mathcomp/odd_order/BGsection3.v
index 25879a6..aa4db05 100644
--- a/mathcomp/odd_order/BGsection3.v
+++ b/mathcomp/odd_order/BGsection3.v
@@ -1,10 +1,18 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div.
+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.
(******************************************************************************)
@@ -241,8 +249,8 @@ without loss{m IHm leGm} [ffulG cycZ]: / rker rG = 1 /\ cyclic 'Z(G).
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 exact/submod_mx_irr.
- by apply: mx_faithful_irr_center_cyclic; exact/trivgP.
+ 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.
@@ -261,7 +269,7 @@ without loss{m IHm leGm} [ffulG cycZ]: / rker rG = 1 /\ cyclic 'Z(G).
rewrite (sameP commG1P trivgP).
apply: subset_trans (kquo_mx_faithful (submod_repr modM)).
rewrite IHm ?quotient_sol ?coprime_morph ?morphim_odd ?quotient_pgroup //.
- - apply: leq_trans leGm; exact: ltn_quotient.
+ - 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.
@@ -280,7 +288,7 @@ case cKK: (abelian K).
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; case/andP=> chHK cHH.
+ 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.
@@ -352,7 +360,7 @@ 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: subset_trans (der_sub _ _) _.
+ 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)].
@@ -368,7 +376,7 @@ case: (eqVneq (rker rG) 1) => [ffulG | ntC]; last first.
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; exact: ltn_quotient.
+ 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.
@@ -378,10 +386,9 @@ have ltK_abelian (N : {group gT}): R \subset 'N(N) -> N \proper K -> abelian N.
rewrite -(rker_subg _ sG1).
apply: IHm defG1 _; rewrite ?(solvableS sG1) ?(pgroupS sG1) //.
by apply/trivgP; rewrite -regR setSI.
- by apply: leq_trans leKm; exact: proper_card.
+ by apply: leq_trans leKm; apply: proper_card.
have cK'K': abelian K^`(1).
- apply: ltK_abelian; first exact: char_norm_trans (der_char _ _) nKR.
- exact: (sol_der1_proper solK).
+ 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 ->
@@ -408,17 +415,17 @@ 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).
- case: (pickP (fun i => ~~ (U i <= fixG K))%MS) => [i nfixU | fixK].
+ have [i nfixU | fixK] := pickP (fun i => ~~ (U i <= fixG K)%MS).
by apply: IH; exists (U i).
- apply: (subset_trans (der_sub _ _)); rewrite rfix_mx_rstabC // -sumU.
+ 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 exact/submod_mx_irr.
+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); exact.
-have nsK'G: K^`(1) <| G by exact: char_normal_trans (der_char _ _) nsKG.
+ 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.
@@ -427,27 +434,26 @@ suffices nregK'U: (rfix_mx rU K^`(1))%MS != 0.
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 exact: socle_exists.
+wlog sK: / socleType rK by apply: socle_exists.
have [i _ def_sK]: exists2 i, i \in setT & [set: sK] = orbit 'Cl G i.
- by apply/imsetP; exact: Clifford_atrans.
+ 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 _); exact: joing_subl.
+ 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.
- apply/subsetP=> i_yz; case/imsetP=> yz; rewrite -{1}defKR.
- case/imset2P=> y z; move/(subsetP ciK); rewrite !inE sub1set inE.
- case/andP=> Gy; move/eqP=> ciy Rz -> ->{yz i_yz}.
+ 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; apply/card_uniqP; rewrite size_map -cardE -/p.
- by rewrite -sKp def_sK /orbit Imset.imsetE cardsE.
+ 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.
@@ -482,9 +488,9 @@ have{sK i M simM sK1 def_sK} irrK: mx_irreducible rK.
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.
- by apply: component_socle; exact: Clifford_simple.
+ exact/component_socle/Clifford_simple.
pose j := PackSocle jP; apply: submx_trans (_ : j <= _)%MS.
- by rewrite PackSocleK component_mx_id //; exact: Clifford_simple.
+ 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.
@@ -518,7 +524,7 @@ have irrK'K: mx_absolutely_irreducible rK'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 exact: socle_exists.
+ 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.
@@ -549,9 +555,9 @@ have irrK'K: mx_absolutely_irreducible rK'K.
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'.
- by apply: component_socle; exact: Clifford_simple.
+ exact/component_socle/Clifford_simple.
pose j := PackSocle jP; apply: submx_trans (_ : j <= _)%MS.
- by rewrite PackSocleK component_mx_id //; exact: Clifford_simple.
+ 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.
@@ -620,12 +626,12 @@ have{n leGn IHn tiHR} IHquo (X : {group gT}):
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 exact: quotient_coprime_sdprod.
+ 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 exact: quotient_sol.
- have coHRb: coprime #|H / X| #|R / X| by exact: coprime_morph.
+ 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.
@@ -633,10 +639,10 @@ without loss Op'H: / '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 // (char_normal_trans (pcore_char _ _)).
+ by rewrite normal_norm // gFnormal_trans.
move defV: 'F(H)%G => V.
have charV: V \char H by rewrite -defV Fitting_char.
-have [sVH nVH]: V \subset H /\ H \subset 'N(V) := andP (char_normal charV).
+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.
@@ -650,7 +656,7 @@ have p'r: r != p.
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 := char_trans (Phi_char _) charV.
+ 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 _)) //.
@@ -683,8 +689,7 @@ without loss{IHquo} indecomposableV: / forall U W,
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.
- exact: char_normal_trans (Fitting_char _) (morphim_normal _ _).
+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).
@@ -717,23 +722,23 @@ 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; exact: quotient_pHall.
+ 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; exact: dvdn_indexg.
+ 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) //; exact/andP.
+ 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 exact: coprime_abelian_cent_dprod.
+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.
@@ -777,7 +782,7 @@ 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 exact: solvableS solG.
+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.
@@ -790,7 +795,7 @@ have tiKR0cV: 'C_(K <*> R0)(V) = 1.
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.
- exact: subsetIl.
+ 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.
@@ -801,7 +806,7 @@ have{nKR0 mulKR0 sKR0_G solKR0 nV_KR0} oCVR0: #|'C_V(R0)| = p.
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; exact: setSI.
+ 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.
@@ -835,15 +840,14 @@ have{IHsub nVH} IHsub: forall X : {group gT},
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 exact: pcore_pgroup.
+ 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 //.
- apply: char_normal_trans (pcore_char _ _) _.
+ 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.
@@ -854,8 +858,7 @@ have{IHsub nVH} IHsub: forall X : {group gT},
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 _)).
- rewrite commg_subI // subsetI ?sPOpHR0 ?sXK //=.
- by rewrite (char_norm_trans (pcore_char _ _)) // normsRl.
+ 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.
@@ -901,23 +904,23 @@ have{scKH} tiPRcK: 'C_(P <*> R)(K) = 1.
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 exact: (pgroupP p'K).
-have{r'K} q'r: r != q by rewrite eq_sym; exact: (pgroupP r'K).
+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 apply: char_norm_trans (pcore_char _ _) _; rewrite join_subG nKP.
+ 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.
- rewrite -p'natE // -defK; exact: pcore_pgroup.
+ 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 exact: morphim_pgroup qK.
+ 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 //.
@@ -925,13 +928,13 @@ have iK'K: 'C_(P <*> R / K')(K / K') = 1 -> #|K / K'| > q ^ 2.
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 exact: quotient_norms.
+ 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 exact: Ohm_sub.
+ 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.
@@ -949,8 +952,8 @@ have iK'K: 'C_(P <*> R / K')(K / K') = 1 -> #|K / K'| > q ^ 2.
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; case/andP=> charL; have sLK := char_sub charL.
- by case/IHsub: sLK cKK => // [|-> -> //]; exact: (char_norm_trans charL).
+ 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.
@@ -1002,7 +1005,7 @@ case cKK: (abelian K); last first.
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; exact: nil_Zgroup_cyclic (pgroup_nil qCKR).
+ 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').
@@ -1044,7 +1047,7 @@ case cKK: (abelian K); last first.
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 exact: commg_norml.
+ 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) //.
@@ -1059,12 +1062,11 @@ case cKK: (abelian K); last first.
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 [|cPK1] := IHsub _ (char_norm_trans (Ohm_char 1 K) nKPR) (Ohm_sub 1 K).
- by move/abelem_Ohm1P->.
+ 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 exact/commG1P.
+ 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].
@@ -1174,7 +1176,7 @@ have [cSR | not_cSR] := boolP (R \subset 'C(S | 'JG)).
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 /=.
- move/subset_trans; apply; exact: bigcap_inf.
+ 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))).
@@ -1232,7 +1234,7 @@ have nVjR Vj: Vj \in S :\: D -> 'C_K(Vj) = [~: K, R].
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; exact: setSI.
+ 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)).
@@ -1250,9 +1252,9 @@ have nVjR Vj: Vj \in S :\: D -> 'C_K(Vj) = [~: K, R].
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_transr _ (mem_orbit 'JG Vj Rx)).
+ 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; exact: joing_subr.
+ 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.
@@ -1282,7 +1284,7 @@ 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 => [-> _ | _ ->] //; exact: nilpotent1.
+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.
@@ -1393,7 +1395,7 @@ 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 exact: quotient_norms.
+ 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.
@@ -1409,7 +1411,7 @@ without loss [p p_pr pKqF]: / exists2 p, prime p & p.-group KqF.
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 ?(char_trans (Fitting_char _)).
+ 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.
@@ -1504,7 +1506,7 @@ 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 exact: joing_subl.
+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) _).
@@ -1639,7 +1641,7 @@ 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 ?(char_norm_trans (Ohm_char 1 _)) //.
+ 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 _)).
@@ -1813,18 +1815,16 @@ have cMK': K^`(1) / V \subset 'C_(K / V)(M / V).
- 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; move/(prime_TIg Rpr); move/trivgP.
- rewrite defVx /= (setIidPr _) cycle_subG //; move/set1P->.
- by rewrite morph1.
+ 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).
-rewrite !subsetI in cVK' cMK' *.
-case/andP: cVK' => sK'K cVK'; case/andP: cMK' => _ cMVK'; rewrite sK'K.
+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 (stable_factor_cent cVK') // /stable_factor /normal sVM nVM !andbT.
+rewrite subsetI sK'K (stable_factor_cent cVK') //; apply/and3P; split=> //.
by rewrite commGC -quotient_cents2 // (subset_trans sK'G).
Qed.
diff --git a/mathcomp/odd_order/BGsection4.v b/mathcomp/odd_order/BGsection4.v
index c33bd2f..65be7a3 100644
--- a/mathcomp/odd_order/BGsection4.v
+++ b/mathcomp/odd_order/BGsection4.v
@@ -1,10 +1,18 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div.
+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.
(******************************************************************************)
@@ -60,7 +68,7 @@ have p3_L21: p <= 3 -> {in R & &, forall u v w, [~ u, v, w] = 1}.
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 exact: groupR.
+- 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.
@@ -94,12 +102,11 @@ have expR1p: exponent 'Ohm_1(R) %| p.
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 exact: leq_trans ltSQ _.
+ 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).
- rewrite commg_subr (char_norm_trans (Ohm_char 1 S)) ?normal_norm //.
- exact: p_maximal_normal pQ maxS.
+ 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.
@@ -129,8 +136,7 @@ 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 first.
- by rewrite centsC (subset_trans (pcore_sub _ _)) ?subsetIr.
+rewrite dprodEsd; last by rewrite centsC gFsub_trans ?subsetIr.
by apply: Burnside_normal_complement; rewrite // subIset ?subsetIr.
Qed.
@@ -140,7 +146,7 @@ Lemma Ohm1_extremal_odd gT (R : {group gT}) p x :
('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->; exact: cyclic1.
+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)).
@@ -175,7 +181,7 @@ 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: char_normal_trans (Ohm_char 1 M) nsMR.
+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.
@@ -219,12 +225,11 @@ 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.
- apply: pgroupS pR; apply: subset_trans (Ohm_sub _ _) (ucn_sub 2 R).
+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; exact: cyclicS.
+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.
@@ -256,7 +261,7 @@ 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 := char_trans (Ohm_char 1 _) (ucn_char 2 S).
+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|.
@@ -268,7 +273,7 @@ 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.
-by apply: (dvdn_trans _ expZp); apply: exponentS.
+exact/(dvdn_trans _ expZp)/exponentS.
Qed.
(* This is B & G, Lemma 4.7, and (except for the trivial converse) Gorenstein *)
@@ -351,7 +356,7 @@ 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; exact/joing_subP.
+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.
@@ -363,7 +368,7 @@ have [<- | ltXR] := eqVproper sXR.
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 := char_normal_trans (Ohm_char 1 S) 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.
@@ -469,8 +474,7 @@ have iTs: #|T : <[s]>| = p.
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 //.
- rewrite -(quotientSGK _ sST); last by rewrite (subset_trans _ nSR) ?Ohm_sub.
- by rewrite -defTb morphim_Ohm.
+ 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.
@@ -497,8 +501,7 @@ 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)) //.
- exact: char_normal_trans (Mho_char e _) nsR'R.
+ 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 => ->.
@@ -530,7 +533,7 @@ 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; exact/joing_subP.
+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.
@@ -550,11 +553,11 @@ 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 exact: groupR.
+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 [_ nXb1R] := andP (char_normal_trans (Mho_char 1 Xb) nsXbR).
+ 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.
@@ -571,8 +574,8 @@ 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 exact: mem_commg.
- have cxt: t \in 'C[x] by apply/cent1P; exact: (centsP cRT).
+ 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).
@@ -615,7 +618,7 @@ have defU1: 'Ohm_1(U) = 'Ohm_1(R).
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 ?(subset_trans (Ohm_sub 1 R) nSR) //.
+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.
@@ -659,7 +662,7 @@ suffices{C T} cTT: abelian [~: R, A].
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 (subset_trans (Ohm_sub 1 _)) ?(char_norm_trans (Ohm_char 1 _)).
+ 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.
@@ -671,14 +674,13 @@ 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 /=.
- rewrite (char_norm_trans (der_char 1 _)) // andbT.
+ 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.
-case/maxgroupP: maxS; case/and3P=> cycS sSR nSA maxS.
+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 exact/andP.
+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 //=.
@@ -689,8 +691,8 @@ 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 := (char_norm_trans (Ohm_char 1 _), quotient_norms S).
- by apply: MaschkeRb1; rewrite ?quotient_pgroup ?morphim_Ohm ?normOhm1.
+ 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.
@@ -708,7 +710,7 @@ have{tiR1bX} cycX: cyclic X.
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 exact: Ohm1_metacyclic_p2Elem.
+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).
@@ -761,7 +763,7 @@ have{recR} IH: forall S, gval S \proper R -> A \subset 'N(S) -> A \subset 'C(S).
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) //.
- by rewrite (char_norm_trans (Ohm_char 1 R)).
+ exact: gFnorm_trans.
have defRA: [~: R, A] = R.
apply: contraNeq not_cRA; rewrite eqEproper commg_subl nRA negbK => ltRAR.
rewrite centsC; apply/setIidPl.
@@ -781,13 +783,13 @@ have [cRR | not_cRR] := boolP (abelian R).
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; case/andP=> charS cSS.
+ 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 rewrite (char_norm_trans (center_char R)).
+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 _ _)) //.
@@ -834,8 +836,8 @@ have p_gt3: p > 3; last split => //.
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 := Ohm_normal 1 R.
-have nsS'R: S' <| R := char_normal_trans (der_char 1 _) nsSR.
+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.
@@ -894,7 +896,7 @@ have{cBbBb} abelBb: p.-abelem (B / C).
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) := char_norm_trans (Ohm_char 1 _) nRA.
+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).
@@ -914,7 +916,7 @@ have{nXbA} nXA: A \subset 'N(X).
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) := pgroupS (subset_trans (Ohm_sub 1 _) sBR) pR.
+ 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.
@@ -950,7 +952,7 @@ have [Ta AbTa not_cSbTa]: exists2 Ta, Ta \in A / T & Ta \notin 'C(S / T).
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 (char_norm_trans (der_char 1 _) nSA) a Aa.
+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.
@@ -1077,14 +1079,14 @@ have s_p'C_B X: gval X \subset C -> p^'.-group X -> X \subset B.
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; case/Cauchy=> // a Ca oa; apply: wlog_neg => p'q.
+ 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 // (subset_trans (der_sub 1 A)).
+ 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.
@@ -1151,14 +1153,14 @@ 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; case=> //=.
- rewrite -quotient_der // card_quotient ?(subset_trans (der_sub 1 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 [sRG nRG] := andP (pcore_normal p G : R <| G).
+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.
@@ -1208,7 +1210,7 @@ wlog Gs_p'_1: gT G Gs U V oddG solG nsGsG rGs chiefUf pUf sUGs / 'O_p^'(Gs) = 1.
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 := char_normal_trans (pcore_char p^' Gs) nsGsG.
+ 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.
@@ -1235,7 +1237,7 @@ wlog Gs_p'_1: gT G Gs U V oddG solG nsGsG rGs chiefUf pUf sUGs / 'O_p^'(Gs) = 1.
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 := char_normal_trans (pcore_char p Gs) nsGsG.
+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.
@@ -1358,9 +1360,9 @@ have hallHp': p^'.-Hall(H) 'O_p^'(H).
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 ?(char_normal_trans (pcore_char _ _)).
+ by rewrite pcore_max ?pcore_pgroup ?gFnormal_trans.
rewrite pcore_max ?pcore_pgroup // (normalS _ _ (pcore_normal _ _)) //.
-rewrite -quotient_sub1 ?(subset_trans (pcore_sub _ _)) //.
+rewrite -quotient_sub1 ?gFsub_trans //.
rewrite -(setIidPr (quotientS _ (pcore_sub _ _))) coprime_TIg //.
by rewrite coprime_morphr // (pnat_coprime pGq (pcore_pgroup _ _)).
Qed.
@@ -1403,10 +1405,10 @@ 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; exact: max_pdiv_max.
+ 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; move/(piSg (pcore_sub _ _)) => piGq.
+apply: sub_in_pnat (pcore_pgroup _ _) => q /(piSg (pcore_sub _ _))-piGq.
by rewrite !inE eqn_leq max_pdiv_max.
Qed.
diff --git a/mathcomp/odd_order/BGsection5.v b/mathcomp/odd_order/BGsection5.v
index ab5a14a..cfb8133 100644
--- a/mathcomp/odd_order/BGsection5.v
+++ b/mathcomp/odd_order/BGsection5.v
@@ -1,8 +1,14 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div.
+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.
(******************************************************************************)
@@ -121,7 +127,7 @@ have [B Ep3B nBR]: exists2 B, B \in 'E_p^3(R) & R \subset 'N(B).
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 := char_normal_trans (Ohm_char 1 _) nsCR.
+ 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).
@@ -157,26 +163,18 @@ 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. exact: subset_trans (Ohm_sub 1 _) (center_sub R). 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 pZ : p.-group Z. Proof. exact: abelem_pgroup abelZ. Qed.
Let defCRZ : 'C_R(Z) = R.
-Proof.
-apply/eqP; rewrite eqEsubset subsetIl subsetIidl centsC.
-by rewrite (subset_trans (Ohm_sub 1 _)) ?subsetIr.
-Qed.
-
-Let sWR : W \subset R.
-Proof. exact: subset_trans (Ohm_sub 1 _) (ucn_sub 2 R). Qed.
+Proof. by apply/setIidPl; rewrite centsC gFsub_trans ?subsetIr. Qed.
-Let nWR : R \subset 'N(W).
-Proof. exact: char_norm_trans (Ohm_char 1 _) (char_norm (ucn_char 2 R)). 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 :
@@ -188,7 +186,7 @@ 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) := char_norm_trans (Ohm_char 1 _) nZR_R.
+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.
@@ -228,8 +226,7 @@ have dimW: logn p #|W| = 2.
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 //= (char_trans (Ohm_char 1 _)) ?ucn_char.
+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=> //.
@@ -281,7 +278,7 @@ have defST: S * T = R.
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) //; move/subset_trans->.
+ 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 //.
@@ -459,7 +456,7 @@ 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 exact: gacts_char.
+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]> / _).
@@ -505,7 +502,7 @@ wlog Gp'1: gT G S oddG nnS solG sylS rS pl1G / 'O_p^'(G) = 1.
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 _)); exact.
+ 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).
@@ -522,13 +519,13 @@ have{defS} pKfA: p.-group ('ker fA).
by rewrite -defS -Fitting_eq_pcore ?cent_sub_Fitting.
split=> [|q].
rewrite -(pmorphim_pgroup pKfA) ?der_sub // morphim_der //.
- by rewrite (pgroupS (der1_min (char_norm _) cAbAb)) ?pcore_pgroup ?pcore_char.
-rewrite mem_primes; case/and3P=> q_pr _; case/Cauchy=> // x Gx ox.
+ 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 //; exact/kerP.
+ 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.
diff --git a/mathcomp/odd_order/BGsection6.v b/mathcomp/odd_order/BGsection6.v
index 234313c..f5323a2 100644
--- a/mathcomp/odd_order/BGsection6.v
+++ b/mathcomp/odd_order/BGsection6.v
@@ -1,8 +1,14 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrfun ssrbool eqtype ssrnat seq div fintype finset.
+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.
(******************************************************************************)
@@ -51,8 +57,8 @@ 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 := subset_trans (char_sub (center_Puig_char S)) (pHall_sub sylS).
-rewrite -!quotientK ?(subset_trans _ (gFnorm _ _)) ?subsetIl //.
+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.
@@ -68,7 +74,7 @@ Lemma coprime_der1_sdprod K H G :
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') := char_norm_trans (der_char 1 K) nKH.
+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).
@@ -98,7 +104,7 @@ Lemma prime_nil_der1_factor G :
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 := char_normal_trans (pcore_char _ _) 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 _ _)) //=.
@@ -183,7 +189,7 @@ 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 => _; exact: (subsetP (cent_sub H)).
+by case/setIP: Cc => _; apply: (subsetP (cent_sub H)).
Qed.
End PprodSubCoprime.
@@ -194,10 +200,10 @@ 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. exact: pcore_normal. 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. exact: subset_trans sSG nKG. 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.
diff --git a/mathcomp/odd_order/BGsection7.v b/mathcomp/odd_order/BGsection7.v
index 9982283..f9db9f7 100644
--- a/mathcomp/odd_order/BGsection7.v
+++ b/mathcomp/odd_order/BGsection7.v
@@ -1,8 +1,14 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div fintype bigop.
+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.
(******************************************************************************)
@@ -119,10 +125,10 @@ Lemma mFT_sol M : M \proper G -> solvable M.
Proof. by case: gT M => ? []. Qed.
Lemma mFT_nonAbelian : ~~ abelian G.
-Proof. apply: contra mFT_nonSolvable; exact: abelian_sol. Qed.
+Proof. by apply: contra mFT_nonSolvable; apply: abelian_sol. Qed.
Lemma mFT_neq1 : G != 1.
-Proof. by apply: contraNneq mFT_nonAbelian => ->; exact: abelian1. Qed.
+Proof. by apply: contraNneq mFT_nonAbelian => ->; apply: abelian1. Qed.
Lemma mFT_gt1 : [1] \proper G. Proof. by rewrite proper1G mFT_neq1. Qed.
@@ -132,7 +138,7 @@ 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->; exact: mFT_nonSolvable.
+by rewrite properT; apply: contraL; move/eqP->; apply: mFT_nonSolvable.
Qed.
Lemma mFT_pgroup_proper p P : p.-group P -> P \proper G.
@@ -162,7 +168,7 @@ exact: mFT_norm_proper.
Qed.
Lemma mFT_cent1_proper x : x != 1 -> 'C[x] \proper G.
-Proof. by rewrite -cycle_eq1 -cent_cycle; exact: mFT_cent_proper. Qed.
+Proof. by rewrite -cycle_eq1 -cent_cycle; apply: mFT_cent_proper. Qed.
Lemma mFT_quo_sol M H : H :!=: 1 -> solvable (M / H).
Proof.
@@ -212,7 +218,7 @@ 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; exact: mmax_max (mFT_norm_proper _ _). Qed.
+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.
@@ -300,7 +306,7 @@ by move/eq_mmax=> ->.
Qed.
Lemma mmax_uniq_id : {subset 'M <= 'U}.
-Proof. by move=> M maxM; apply/uniq_mmaxP; exists M; exact: mmax_sup_id. Qed.
+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.
@@ -311,8 +317,8 @@ Qed.
Lemma uniq_mmaxJ K x :((K :^ x)%G \in 'U) = (K \in 'U).
Proof.
apply/uniq_mmaxP/uniq_mmaxP=> [] [M uK_M].
- exists (M :^ x^-1)%G; rewrite -(conjsgK x K); exact: def_uniq_mmaxJ.
-by exists (M :^ x)%G; exact: def_uniq_mmaxJ.
+ 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}) :
@@ -465,10 +471,9 @@ suffices: P \subset K.
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 (char_norm_trans (pcore_char _ _)) ?normsG ?joing_subr //.
- rewrite andbT -quotient_sub1; last first.
- rewrite (subset_trans (pcore_sub _ _)) // join_subG normG cents_norm //.
- by rewrite centsC.
+ 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.
@@ -503,9 +508,8 @@ wlog defH: H prHG sAH ntHQ1 ntHQ2 / Q1 :&: Q2 != 1 -> H :=: 'N(Q1 :&: Q2).
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 (char_norm_trans (pcore_char _ _)) ?normsG //.
- rewrite coprime_sym coprime_pi' ?cardG_gt0 ?[pnat _ _]pcore_pgroup //.
- by rewrite (solvableS sLH) ?mFT_sol.
+ 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.
@@ -525,8 +529,7 @@ 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.
- apply: contra ntHQ2; rewrite -!subG1; apply: subset_trans.
- by rewrite subsetI subsetIr (subset_trans sQR2).
+ 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.
@@ -541,8 +544,8 @@ suff [prI1 prI2]: Q1 :&: Q2 \proper Q1 :&: R1 /\ Q1 :&: Q2 \proper Q2 :&: R2.
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].
- rewrite !proper1G; split; [apply: contra ntHQ1 | apply: contra ntHQ2];
- by rewrite -!subG1; apply: subset_trans; rewrite subsetI subsetIl.
+ 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 //.
@@ -591,18 +594,17 @@ 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.
- apply: contra ntCQ1; rewrite -!subG1; apply: subset_trans.
- by rewrite setIS //= -cent_cycle centS ?cycle_subG.
-exists k => //; exact: val_inj.
+ 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; case/rank_geP=> B; case/nElemP=> p; do 2![case/setIdP].
-rewrite subsetI; case/andP=> sBA cAB abelB mB2; have [_ cBB _] := and3P abelB.
-have{abelB mB2} ncycB: ~~ cyclic B by rewrite (abelem_cyclic abelB) (eqP mB2).
+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.
@@ -616,12 +618,12 @@ 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 rewrite -!proper1G; move/proper_sub_trans->.
+ 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; case/and3P=> ->.
+ 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; move/coprime_abelian_gen_cent1 <- => //; last first.
+ 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.
@@ -629,9 +631,9 @@ 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: contra ntRC; rewrite -!subG1; apply: subset_trans.
- by rewrite setIS //= -cent_cycle centS // cycle_subG (subsetP sBA).
-exists k => //; exact: val_inj.
+ 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. *)
@@ -644,12 +646,11 @@ Theorem normed_trans_superset P :
/\ 'N(P) = 'C_K(P) * 'N_('N(P))(Q)}].
Proof.
move=> snAP piP trnK; set KP := 'O_pi^'('C(P)).
-have defK: forall B, A \subset B -> 'C_K(B) = 'O_pi^'('C(B)).
- move=> B sAB; apply/eqP; rewrite eqEsubset {1}setIC pcoreS ?centS //.
- rewrite subsetI pcore_sub (sub_Hall_pcore hallK) ?pcore_pgroup //.
- by rewrite (subset_trans (pcore_sub _ _)) ?centS.
+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) := char_normal_trans (pcore_char _ _) (cent_normal _).
+ 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.
@@ -667,7 +668,7 @@ wlog{snAP} [B maxnB snAB]: / {B : grT | maxnormal B P P & A <|<| B}.
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 exact: leq_trans (proper_card 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) _ => //.
@@ -678,7 +679,7 @@ have{abelPB} [p p_pr pPB]: exists2 p, prime p & p.-group (P / B).
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; exact: quotient_pgroup.
+ 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.
@@ -717,13 +718,13 @@ have smnP_S: |/|*(P; q) \subset S.
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; exact: pi_pnat qNQ2 _.
+ 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 (char_norm_trans (pcore_char _ _)) ?norms_norm.
+ - 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).
@@ -732,9 +733,8 @@ 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 exact: pcore_pgroup.
-have nKB_P: P \subset 'N(KB).
- by rewrite (char_norm_trans (pcore_char _ _)) ?norms_cent.
+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.
@@ -799,14 +799,14 @@ 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 exact: Ohm_sub.
+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 exact: (char_normal_trans (Ohm_char _ _)).
+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 exact: pgroupS (center_sub _) pP.
- have pZ: p.-group Z by exact: pgroupS sZ_ZP pZP.
+ 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).
@@ -890,7 +890,7 @@ wlog Zb: b X Y defX B'b p'Y nYA sYX / b \in Z.
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 (char_normal_trans (center_char _)).
+ 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).
@@ -904,8 +904,7 @@ wlog Zb: b X Y defX B'b p'Y nYA sYX / b \in Z.
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).
- rewrite !(char_norm_trans (pcore_char _ _)) ?(subset_trans sZA) ?normsG //.
- by rewrite -defX cBA.
+ 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 _ _)).
@@ -923,14 +922,14 @@ wlog Zb: b X Y defX B'b p'Y nYA sYX / b \in Z.
- 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 exact: pcore_normal.
+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 exact: pHall_subl (subsetT _) sylP.
+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)|.
@@ -942,8 +941,8 @@ have cYAq: A / K \subset 'C_('O_p(X / K))(Y / K).
by rewrite commg_subl /= gFnorm.
have cYKq: Y / K \subset 'C('O_p(X / K)).
apply: coprime_nil_faithful_cent_stab => /=.
- - by rewrite (char_norm_trans (pcore_char _ _)) ?normsG ?quotientS.
- - by rewrite coprime_morphr ?(pnat_coprime (pcore_pgroup _ _)).
+ - 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 //.
diff --git a/mathcomp/odd_order/BGsection8.v b/mathcomp/odd_order/BGsection8.v
index 8e306fa..60d8a67 100644
--- a/mathcomp/odd_order/BGsection8.v
+++ b/mathcomp/odd_order/BGsection8.v
@@ -1,7 +1,12 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div fintype path.
+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.
(******************************************************************************)
@@ -41,17 +46,16 @@ 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; exact: piSg.
+ 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.
- apply: mmax_normal => //=; apply: char_normal_trans (Fitting_normal _).
- exact: char_trans (pcore_char _ _) (center_char _).
+ by apply: mmax_normal => //=; rewrite !gFnormal_trans.
have sCqM: forall q, q \in pi -> 'C(A`q) \subset M.
- move=> q; move/def_nZq <-; rewrite cents_norm // centS //.
+ move=> q /def_nZq <-; rewrite cents_norm // centS //.
rewrite (sub_Hall_pcore (nilpotent_pcore_Hall _ _)) ?pcore_pgroup //.
- by apply: nilpotentS (Fitting_nil M); exact: subsetIl.
- exact: subset_trans (pcore_sub _ _) _.
+ 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).
@@ -76,33 +80,31 @@ have{p'F} pi_alt q: exists2 r, r \in pi & r != q.
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.
- exact: subset_trans (pcore_sub _ _) (subset_trans sZA sAX).
+- 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 (subset_trans (pcore_sub _ _)) ?subsetIr //=.
- by rewrite (char_norm_trans (pcore_char _ _)) ?normsG // subsetI sZqX normG.
+ 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 (subset_trans (pcore_sub _ _)) ?subsetIl.
+ 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.
- rewrite (subset_trans (pcore_sub _ _)) //= def_nZq //.
+ 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)) //; last first.
- exact: subset_trans (pcore_sub _ _) sAF.
+ 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; case/and3P=> sYX pi'Y nYA.
+ 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.
@@ -116,13 +118,12 @@ have cstrA: normed_constrained A.
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 //.
- - by rewrite (subset_trans (pcore_sub _ _)).
- - rewrite coprime_sym (coprimeSg (pcore_sub _ _)) //= -/A.
+ 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')) // commg_subr.
- by rewrite (char_norm_trans (pcore_char _ _)) ?normsG.
+ 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.
@@ -144,7 +145,7 @@ have{cstrA} nbyApi'1 q: q \in pi^' -> |/|*(A; q) = [set 1%G].
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; exact: gFnorm.
+ 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 //.
@@ -161,8 +162,7 @@ have piD: \pi(D) = 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).
- rewrite (char_norm_trans (pcore_char _ _)) //.
- by rewrite (subset_trans sAH) ?gFnorm.
+ 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.
@@ -171,20 +171,19 @@ have piD: \pi(D) = pi.
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 //; exact: pcore_pgroup.
- rewrite -bigcap_p'core subsetI (subset_trans (pcore_sub _ _)) //=.
- apply/bigcapsP=> [[r /= _] sig_r]; apply: sArXq' => //; first exact: pi_sig.
- by apply: contra sig'q; move/eqP <-.
+ 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 //.
- rewrite subsetI subxx /= p_core_Fitting (subset_trans (pcore_sub _ _)) //.
- exact: gFnorm.
- rewrite subsetI sArHq' (subset_trans (subset_trans (pcore_sub _ _) sAH)) //.
- by rewrite /= p_core_Fitting gFnorm.
+ 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.
@@ -194,7 +193,7 @@ have cApHp': A`p \subset 'C('O_p^'(H)).
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 (subset_trans (subset_trans (pcore_sub _ _) sAH)) ?gFnorm.
+ 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.
@@ -211,14 +210,14 @@ have sHp'_NMDp': 'O_p^'(H) \subset 'O_p^'('N_M(D`p)).
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 (subset_trans (pcore_sub _ _)).
+ 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 !(subset_trans (pcore_sub _ _)) ?gFnorm.
+ 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.
@@ -226,7 +225,7 @@ have sMp'H: 'O_p^'(M) \subset H.
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 (subset_trans (subset_trans (pcore_sub _ _) sDM)) ?gFnorm.
+ 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.
@@ -234,7 +233,7 @@ have sMp'H: 'O_p^'(M) \subset H.
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 (subset_trans (pcore_sub _ _)) //= -/F centsC.
+ 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.
@@ -244,8 +243,7 @@ have{sHp'Mp' sMp'H} eqHp'Mp': 'O_p^'(H) = 'O_p^'(M).
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 (char_normal_trans (pcore_char _ _) _)) //.
- by rewrite (char_normal_trans (center_char _)) ?Fitting_normal.
+ 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).
@@ -280,7 +278,7 @@ have sAF: A \subset F.
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 := char_normal_trans (center_char _) (Fitting_normal _).
+ 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.
@@ -288,18 +286,17 @@ have sCAM: 'C(A) \subset M.
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).
- by rewrite (char_norm_trans (center_Puig_char P)).
- apply/eqP; move/(trivg_center_Puig_pgroup (pHall_pgroup sylP))=> P1.
+ 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 := subset_trans (pcore_sub _ _) sCAM.
+ 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 (subset_trans (subset_trans (pcore_sub _ _) sCAM)) ?gFnorm.
+ - 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.
@@ -331,14 +328,13 @@ have{p'nbyA_1} p'nbyA_1 X:
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) (char_norm_trans _ nXA).
- exact: pcore_char.
+ have [R] := max_normed_exists (pcore_pgroup q X) (gFnorm_trans _ nXA).
by rewrite p'nbyA_1 // => /set1P->.
-apply/subsetPn=> [[H0 MA_H0 neH0M]].
-have:= erefl [arg max_(H > H0 | (H \in 'M(A)) && (H != M)) #|H :&: M|`_p].
-case: arg_maxP => [|H {H0 MA_H0 neH0M}]; first by rewrite MA_H0 -in_set1.
-rewrite /= inE -andbA; case/and3P=> maxH sAH neHM maxHM _.
-have prH: H \proper G by rewrite inE in maxH; exact: maxgroupp maxH.
+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.
@@ -370,7 +366,7 @@ have ntZLR: 'Z('L(R)) != 1.
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 (char_norm_trans (center_Puig_char R)).
+ 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 _.
@@ -389,7 +385,7 @@ have [pF | npF] := boolP (p.-group 'F(M)).
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; exact: uniq_mmaxS.
+ 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.
diff --git a/mathcomp/odd_order/BGsection9.v b/mathcomp/odd_order/BGsection9.v
index dba9344..2153024 100644
--- a/mathcomp/odd_order/BGsection9.v
+++ b/mathcomp/odd_order/BGsection9.v
@@ -1,9 +1,16 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div fintype path.
+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.
(******************************************************************************)
@@ -46,7 +53,7 @@ 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 exact: gFnorm.
+ 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.
@@ -70,9 +77,8 @@ 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).
- exact: char_norm_trans (center_Puig_char P) _.
- apply: contraNneq ntR => /(trivg_center_Puig_pgroup pP) P1.
+ 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.
@@ -222,7 +228,7 @@ 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 //; exact: pi_of_prime.
+ 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).
@@ -278,7 +284,7 @@ have sNP_mCA M: M \in 'M('C(A)) -> 'N(P) \subset M.
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: (subset_trans (pcore_sub _ _)).
+ 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).
@@ -304,8 +310,7 @@ have uNP0_mCA M: M \in 'M('C(A)) -> 'M('N(P0)) = [set M].
have cDP0: P0 \subset 'C(D).
have sA1A := Ohm_sub 1 A.
have nDA1: 'Ohm_1(A) \subset 'N(D).
- apply: subset_trans sA1A (subset_trans sAM (char_norm _)).
- exact: char_trans (pcore_char _ _) (Fitting_char _).
+ 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.
@@ -348,7 +353,7 @@ have uNP0_mCA M: M \in 'M('C(A)) -> 'M('N(P0)) = [set M].
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:= char_normal_trans (pcore_char _ _) (Fitting_normal M).
+ 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.
@@ -388,7 +393,7 @@ have uNP0_mCA M: M \in 'M('C(A)) -> 'M('N(P0)) = [set M].
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 rewrite (subset_trans _ (gFnorm _ _)).
+ 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.
diff --git a/mathcomp/odd_order/Make b/mathcomp/odd_order/Make
index d7ed459..a7ba4be 100644
--- a/mathcomp/odd_order/Make
+++ b/mathcomp/odd_order/Make
@@ -1,4 +1,3 @@
-all.v
BGappendixAB.v
BGappendixC.v
BGsection10.v
diff --git a/mathcomp/odd_order/PFsection1.v b/mathcomp/odd_order/PFsection1.v
index dc5ce95..d5e8ea3 100644
--- a/mathcomp/odd_order/PFsection1.v
+++ b/mathcomp/odd_order/PFsection1.v
@@ -1,9 +1,16 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
-Require Import perm automorphism quotient action zmodp center commutator.
+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.
Require ssrint.
@@ -28,110 +35,54 @@ Variable gT : finGroupType.
Lemma odd_eq_conj_irr1 (G : {group gT}) t :
odd #|G| -> (('chi[G]_t)^*%CF == 'chi_t) = ('chi_t == 1).
Proof.
-move=> OG; apply/eqP/eqP=> [Ht | ->]; last exact: cfConjC_cfun1.
-pose a := (@Zp1 1).
-have Aito:
- is_action <[a]> (fun (t : Iirr G) v => if v == a then conjC_Iirr t else t).
- split=> [[[|[]]] //= _ t1 t2 Hj |j [[|[]]] // HH1 [[|[]]] // HH2 ] //=.
- by apply: (inv_inj (@conjC_IirrK _ _)).
- by rewrite conjC_IirrK.
-pose ito := Action Aito.
-have Acto:
- is_action <[a]> (fun (c : {set gT}) v => if v == a then c^-1%g else c).
- split=> [[[|[]]] //= _ t1 t2 Hj |j [[|[]]] // HH1 [[|[]]] // HH2 ] //=.
- by rewrite -[t1]invgK Hj invgK.
- by rewrite invgK.
-pose cto := Action Acto.
-have F1: [acts <[a]>, on (classes G) | cto].
- apply/subsetP=> j Hj.
- rewrite !inE Hj; apply/subsetP=> u.
- case/imsetP=> g GiG ->.
- by rewrite inE /=; case: (_ == _) => //;
- rewrite -?classVg mem_classes // ?groupV.
-have F2 u x y: x \in G -> y \in cto (x ^: G) a -> 'chi_u x = 'chi_(ito u a) y.
- rewrite mem_invg -{2}[y]invgK => Gx {y}/imsetP[y Gy ->].
+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 F3: forall c, c \in classes G -> c^-1%g = c -> c = 1%g.
- move=> c; case/imsetP => g GiG ->; rewrite -classVg => Hg.
- move: (class_refl G g^-1); rewrite Hg; case/imsetP=> x XiG Hx.
- have F4: (x ^+ 2)%g \in 'C_G[g].
- apply/subcent1P; split; rewrite ?groupM //.
- apply: (mulgI (x * x * g)^-1)%g.
- rewrite mulVg !invMg Hx conjgE !mulgA mulgK.
- rewrite -[(_ * g * x)%g]mulgA -[(_ * (g * _))%g]mulgA -conjgE.
- by rewrite -Hx mulgK mulVg.
- have F5 : x \in 'C_G[g].
- suff->: (x = (x ^+ 2) ^+ (#|G| %/2).+1)%g by apply: groupX.
- rewrite -expgM -[(_%/_).+1]addn1 mulnDr muln1 -{3}addn1 addnA.
- move: (modn2 #|G|); rewrite {1}OG /= => HH; rewrite -{3}HH.
- rewrite [(2 * _)%N]mulnC -divn_eq expgD expg1.
- by move: (order_dvdG XiG); rewrite order_dvdn; move/eqP->; rewrite mul1g.
- move: Hx; rewrite conjgE; case/subcent1P: F5=> _ ->.
- rewrite mulgA mulVg mul1g => HH.
- have F6: (g ^+ 2 == 1)%g by rewrite expgS -{1}HH expg1 mulVg.
- suff: #[g] == 1%N by rewrite order_eq1; move/eqP->; apply: class1G.
- move: F6 (order_gt0 g) (order_dvdG GiG); rewrite -order_dvdn.
- move/(dvdn_leq (isT : (0 < 2)%N)); case: #[_]=> // [[|[]]] //.
- by rewrite dvdn2 OG.
-apply/eqP; case: (boolP (t == 0))=> // Hd.
- by move/eqP: Hd->; rewrite irr0.
-have:= card_afix_irr_classes (cycle_id a) F1 F2.
-have->: #|'Fix_(classes G | cto)[a]| = 1%N.
- apply: (@eq_card1 _ 1%g)=> c; apply/idP/idP; rewrite !inE.
- case/andP=> GiG HH; apply/eqP; apply: F3=> //; apply/eqP.
- by move/subsetP: HH; move/(_ a); rewrite !inE eqxx; apply.
- move/eqP->; rewrite classes1.
- apply/subsetP=> b; rewrite !inE; move/eqP=> -> /=.
- by rewrite invg1.
-rewrite (cardD1 (0 : Iirr _)).
-have->: 0 \in 'Fix_ito[a].
- apply/afixP=> b; rewrite !inE; move/eqP->; rewrite /=.
- apply: irr_inj; apply/cfunP=> g.
- by rewrite conjC_IirrE cfConjCE irr0 cfun1E conjC_nat.
-rewrite (cardD1 t) //.
-suff->: t \in [predD1 'Fix_ito[a] & 0] by [].
-rewrite inE /= Hd.
-apply/afixP=> b; rewrite !inE; move/eqP->; rewrite /=.
-apply: irr_inj; apply/cfunP=> g.
-by rewrite conjC_IirrE Ht.
+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 not_in_ker_char0 t g : g \in G ->
+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.
-move=> GiG HnG nHsC CH1.
-have: (#|'C_G[g]| <= #|'C_(G/H)[coset H g]|)%N.
- suff->: #|'C_G[g]| = #|'C_G[g] / H|%G.
- by apply: (subset_leq_card (quotient_subcent1 H G g)).
- apply: card_isog.
- apply: isog_trans (second_isog _); last first.
- apply: subset_trans (normal_norm HnG).
- by apply: subcent1_sub.
- suff->: H :&: 'C_G[g] = 1%g by exact: quotient1_isog.
- rewrite -CH1.
- apply/setP=> h; rewrite inE.
- apply/andP/subcent1P; case=> H1 H2; split=> //.
- by move/subcent1P: H2; case.
- apply/subcent1P; split=> //.
- by apply: (subsetP (normal_sub HnG)).
-have F1: coset H g \in (G / H)%g by exact: mem_quotient.
-rewrite -leC_nat.
-have:= second_orthogonality_relation g GiG.
-rewrite mulrb class_refl => <-.
-have:= second_orthogonality_relation (coset H g) F1.
-rewrite mulrb class_refl => <-; rewrite -!(eq_bigr _ (fun _ _ => normCK _)).
-rewrite sum_norm_irr_quo // (bigID (fun i => H \subset cfker 'chi_i)) //=.
-set S := \sum_(i | ~~ _) _; set S' := \sum_(i | _) _ => HH.
-have /eqP F2: S == 0.
- rewrite eqr_le -(ler_add2l S') addr0 HH /=.
- by apply: sumr_ge0 => j _; rewrite mulr_ge0 ?normr_ge0.
-apply/eqP; have: `|'chi_t g| ^+ 2 == 0.
- apply/eqP; apply: (psumr_eq0P _ F2) nHsC => j _.
- by rewrite mulr_ge0 ?normr_ge0.
-by rewrite mulf_eq0 orbb normr_eq0.
+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). *)
@@ -247,13 +198,13 @@ 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 exact: mem_tnth.
-have{irrChi} irrChi i: chi i \in irr H by exact: irrChi.
+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 //; exact: irr_inj.
+ 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].
@@ -371,7 +322,7 @@ Lemma cfclass_Ind_irrP i j :
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 exact: Ind_irr_neq0.
+right=> eq_chijG; have /negP[]: 'Ind[G] 'chi_i != 0 by apply: Ind_irr_neq0.
by rewrite -cfnorm_eq0 {1}eq_chijG Oji.
Qed.
@@ -611,7 +562,7 @@ 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); exact: (cfker_constt _ Hi1).
+ 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 //.
diff --git a/mathcomp/odd_order/PFsection10.v b/mathcomp/odd_order/PFsection10.v
index d380e47..3e717c6 100644
--- a/mathcomp/odd_order/PFsection10.v
+++ b/mathcomp/odd_order/PFsection10.v
@@ -1,13 +1,24 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
(******************************************************************************)
@@ -163,7 +174,7 @@ Lemma FTtypeP_ref_irr :
Proof.
have [_ /has_nonprincipal_irr[s nz_s] _ _ _] := Frobenius_context frobMbar.
exists ('Ind 'chi_s %% M'')%CF; split.
-- exact/cfMod_irr/(irr_induced_Frobenius_ker (FrobeniusWker frobMbar)).
+- 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.
@@ -706,8 +717,9 @@ have lb_rho: 1 - w1%:R / #|M'|%:R <= '[rho chi].
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.
+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.
@@ -882,20 +894,22 @@ 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: nilpotent `H by rewrite -defMF Fcore_nil.
-have scohS := subset_subcoherent scohS0 sSS0.
-have [|//|[[_]]] := (non_coherent_chief nsM'M (nilpotent_sol nilH) scohS) 1%G.
- split; rewrite ?mFT_odd ?normal1 ?sub1G ?quotient_nil //.
- by rewrite joingG1 (FrobeniusWker frobMbar).
-rewrite /= joingG1 -(index_sdprod defM) /= -/w1 -[H^`(1)%g]/`H' => ubHbar [p[]].
-rewrite -(isog_abelian (quotient1_isog H)) -(isog_pgroup p (quotient1_isog H)).
-rewrite subn1 => pH not_cHH /negP not_w1_dv_p'1.
+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 [p_pr _ [e oH]] := pgroup_pdiv pH ntH.
-rewrite -/w1 /= defMF oH pi_of_exp {e oH}// /pi_of primes_prime // in MtypeV.
-have [tiHG | [_ /predU1P[->[]|]]// | [_ /predU1P[->|//] [oH w1p1 _]]] := MtypeV.
+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.
@@ -903,8 +917,8 @@ have [tiHG | [_ /predU1P[->[]|]]// | [_ /predU1P[->|//] [oH w1p1 _]]] := MtypeV.
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).
-rewrite pcore_pgroup_id // in oH.
-have esH: extraspecial H.
+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.
diff --git a/mathcomp/odd_order/PFsection11.v b/mathcomp/odd_order/PFsection11.v
index 3584dbe..e981181 100644
--- a/mathcomp/odd_order/PFsection11.v
+++ b/mathcomp/odd_order/PFsection11.v
@@ -1,13 +1,24 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
(******************************************************************************)
@@ -180,10 +191,10 @@ Let nH0M: M \subset 'N(H0).
Proof. by have /andP[/maxgroupp/andP[]] := chiefH0. Qed.
Let nsH0H : H0 <| H.
-Proof. by rewrite /normal sH0H (subset_trans (Fcore_sub _)). Qed.
+Proof. by rewrite /normal sH0H gFsub_trans. Qed.
Let nsH0C_M : H0C <| M.
-Proof. by rewrite !normalY ?gFnormal /normal ?(subset_trans sH0H) ?gFsub. Qed.
+Proof. by rewrite normalY // /normal ?(subset_trans sH0H) ?gFsub. Qed.
Let defH0C : H0 \x C = H0C.
Proof.
@@ -206,7 +217,7 @@ 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_coherent-bounded_coh1 := scoh1.
+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).
@@ -220,17 +231,15 @@ Lemma bounded_proper_coherent H1 :
(#|HU : H1| <= 2 * q * #|U : C| + 1)%N.
Proof.
move=> nsH1_M psH1_M' cohH1; have [nsHHU _ _ _ _] := sdprod_context defHU.
-rewrite -leC_nat natrD -ler_subl_addr.
-have ->: (2 * q * #|U : C|)%:R = 2%:R * #|M : HC|%:R * sqrtC #|HC : HC|%:R.
- rewrite indexgg sqrtC1 mulr1 -mulnA natrM; congr (_ * _%:R).
- apply/eqP; rewrite // -(eqn_pmul2l (cardG_gt0 HC)) Lagrange ?normal_sub //.
- rewrite mulnCA -(dprod_card defHC) -mulnA (Lagrange (subsetIl _ _)).
- by rewrite -(sdprod_card defM) -(sdprod_card defHU) mulnC.
-have ns_M: [/\ H1 <| M, H0C <| M, HC <| M & HC <| M] by [].
-case: (coherent_seqIndD_bound _ _ scoh1 ns_M) FTtype34_noncoherence => //.
-suffices /center_idP->: abelian (HC / H0C) by rewrite genS ?setSU.
-suffices /isog_abelian->: HC / H0C \isog H / H0 by apply: abelem_abelian p _ _.
-by rewrite /= (joingC H0) isog_sym quotient_sdprodr_isog ?(dprodWsdC defHC).
+suffices: #|HU : H1|%:R - 1 <= 2%:R * #|M : HC|%:R * sqrtC #|HC : HC|%:R.
+ 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). *)
@@ -295,8 +304,8 @@ have{isomHU} defC: C :=: U'.
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') := gFnorm _ _.
- have nH'U: U \subset 'N(H') := char_norm_trans (der_char _ _) nHU.
+ 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.
@@ -342,7 +351,7 @@ suffices defRHpU: R \x ('O_p(H) <*> U) = HU.
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 (char_norm_trans (pcore_char p H) nHU)).
+rewrite joingC norm_joinEl 1?gFnorm_trans //.
by rewrite -(setIidPl sRH) -setIA -group_modr ?gFsub // tiHU mul1g.
Qed.
@@ -441,7 +450,7 @@ have{pHhat} gal'M: ~~ typeP_Galois MtypeP.
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 (char_norm_trans (center_char _)) ?quotient_norms.
+ 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.
@@ -1081,7 +1090,7 @@ have bridgeS1: {in S1, forall zeta, eq_proj_eta (tau (bridge0 zeta)) eta0row}.
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 ?irr_aut // subrr mulr0.
+ 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).
diff --git a/mathcomp/odd_order/PFsection12.v b/mathcomp/odd_order/PFsection12.v
index 2b3a3e1..fa68ea5 100644
--- a/mathcomp/odd_order/PFsection12.v
+++ b/mathcomp/odd_order/PFsection12.v
@@ -1,17 +1,32 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
@@ -49,10 +64,8 @@ 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 ntH] := (nilpotent_sol (Fcore_nil L), mmax_Fcore_neq1 maxL).
-have [s Ls nzs] := solvable_has_lin_char ntH solH.
-exists ('Ind 'chi_s); last by rewrite cfInd1 ?gFsub // lin_char1 ?mulr1.
-by rewrite mem_seqInd ?gFnormal ?normal1 // !inE sub1G subGcfker -irr_eq1 nzs.
+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.
@@ -122,11 +135,11 @@ have CHy1: 'C_H[y] = 1%g.
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[/not_in_ker_char0->].
+by rewrite !inE => /andP[/irr_reg_off_ker_0->].
Qed.
(* This is Peterfalvi (12.2)(a), second part. *)
-Lemma FPtype1_irr_isometry :
+Lemma FTtype1_irr_isometry :
{in 'Z[calI, L^#], isometry tau, to 'Z[irr G, G^#]}.
Proof.
apply: (sub_iso_to _ _ (Dade_Zisometry _)) => // phi.
@@ -136,21 +149,21 @@ 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 FPtype1_irr_subcoherent :
+Lemma FTtype1_irr_subcoherent :
{R : 'CF(L) -> seq 'CF(G) | subcoherent calI tau R}.
Proof.
-apply: irr_subcoherent; last exact: FPtype1_irr_isometry.
+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: subset_trans; apply: gFsub.
+by apply: contra kerH'i; apply: gFsub_trans.
Qed.
-Local Notation R1gen := FPtype1_irr_subcoherent.
+Local Notation R1gen := FTtype1_irr_subcoherent.
(* This is Peterfalvi (12.2)(b). *)
-Lemma FPtype1_subcoherent (R1 := sval R1gen) :
+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),
@@ -161,7 +174,7 @@ Lemma FPtype1_subcoherent (R1 := sval R1gen) :
Proof.
have nrS: ~~ has cfReal calS by apply: seqInd_notReal; rewrite ?mFT_odd.
have U_S: uniq calS by apply: seqInd_uniq.
-have ccS: conjC_closed calS by apply: cfAut_seqInd.
+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.
@@ -180,7 +193,8 @@ exists R; split => //= => [| i Ii]; last first.
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.
+ 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.
@@ -226,8 +240,8 @@ Qed.
End Twelve2.
-Local Notation R1gen := FPtype1_irr_subcoherent.
-Local Notation Rgen := FPtype1_subcoherent.
+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)
@@ -506,8 +520,7 @@ 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.
-pose R := sval (Rgen maxL Ltype1).
-have scohS: subcoherent calS tau R by case: (svalP (Rgen maxL Ltype1)).
+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.
@@ -516,17 +529,13 @@ have [tiH | [cHH _] | [expUdvH1 _]] := MtypeI.
- 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.
-have isoHbar := quotient1_isog H.
-have /(_ 1%G)[|//|[_ [p [pH _] /negP[]]]] := non_coherent_chief nsHL solH scohS.
- split; rewrite ?mFT_odd ?normal1 ?sub1G -?(isog_nil isoHbar) //= joingG1.
+apply: (non_coherent_chief _ _ scohS) id _ => // [|[_ [p [pH _] /negP[]]]].
+ split; rewrite ?mFT_odd ?normal1 ?sub1G ?quotient_nil //= joingG1.
apply/existsP; exists (U / H')%G.
- rewrite Frobenius_proper_quotient ?(sol_der1_proper solH) //.
- exact: char_normal_trans (der_char 1 H) nsHL.
-rewrite -(isog_pgroup p isoHbar) in pH.
-have [pr_p p_dv_H _] := pgroup_pdiv pH ntH.
-rewrite subn1 -(index_sdprod defL).
-have [-> *] := typeF_context MtypeF; last by split; rewrite ?(sdprodWY defL).
-by rewrite expUdvH1 // mem_primes pr_p cardG_gt0.
+ 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.
@@ -585,7 +594,7 @@ 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') := char_norm_trans (der_char 1 K) nKP1.
+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'.
@@ -627,6 +636,7 @@ 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). *)
@@ -664,7 +674,7 @@ have [Ltype1 | notLtype1] := boolP (FTtype L == 1)%N; last first.
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 [[_ _ 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.
@@ -696,22 +706,19 @@ 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 chP1H: P1 \char H := char_trans (Ohm_char 1 _) (pcore_char p H).
have sylP: p.-Sylow(H) P := nilpotent_pcore_Hall p (Fcore_nil L).
-have [sPH pP _] := and3P sylP.
+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 [pP1 _] := andP abelP1.
have prankP1: 'r_p(P1) = 2.
- apply/eqP; rewrite p_rank_Ohm1 eqn_leq -{1}rank_pgroup // -{1}rankH rankS //=.
- by rewrite -prankP0 (p_rank_Sylow sylP) p_rankS.
-have ntP1: P1 != 1%g by rewrite -rank_gt0 (rank_pgroup pP1) prankP1.
+ 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 (char_norm_trans chP1H) ?(subset_trans sU0U).
-rewrite subn1 -prankP1 p_rank_abelem // -card_pgroup //.
-have frobP1U0 := Frobenius_subl ntP1 (char_sub chP1H) nP1U0 frobHU0.
+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 have:= piUq; rewrite -expU0 pi_of_exponent mem_primes => /and3P[].
+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.
@@ -745,8 +752,7 @@ have nP0A: A \subset 'N(P0).
rewrite [_ :&: _](sub_pHall sylP0_HM) ?setSI ?pcore_sub //.
by rewrite (pgroupS (subsetIl _ _)) ?pcore_pgroup.
by rewrite subsetI sP0Hp.
- have chHpL: 'O_p(H) \char L := char_trans (pcore_char p H) (Fcore_char L).
- by rewrite normsI ?(char_norm_trans chHpL) ?normsG // cycle_subG.
+ 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].
@@ -823,22 +829,20 @@ have sZP0: 'Z(P) \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) // (subG1_contra sP0P) //.
- by apply/trivgPn; exists x.
+ 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 charTP: T \char P := char_trans (Ohm_char 1 _) (center_char P).
have{ntT} [V minV sVT]: {V : {group gT} | minnormal V E & V \subset T}.
- apply: mingroup_exists; rewrite ntT (char_norm_trans charTP) //.
- exact: char_norm_trans (pcore_char p H) nHE.
+ by apply: mingroup_exists; rewrite ntT 3?gFnorm_trans.
have abelT: p.-abelem T by rewrite Ohm1_abelem ?center_abelian ?(pgroupS sZP0).
-have sTP := subset_trans (Ohm_sub 1 _) 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 := subset_trans sVT (subset_trans (char_sub charTP) sPH).
+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.
@@ -1168,8 +1172,7 @@ have lb_psiM: '[rhoM psi] >= #|K :\: K'|%:R / #|M|%:R * e.-1%:R ^+ 2.
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) //.
- rewrite (subsetP _ _ P01x) // (subset_trans (Ohm_sub 1 _)) //.
- by rewrite (subset_trans sP0H) ?gFsub.
+ 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.
@@ -1190,7 +1193,7 @@ have lb_psiM: '[rhoM psi] >= #|K :\: K'|%:R / #|M|%:R * e.-1%:R ^+ 2.
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 _) _ _ 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 // => -[_ _ []//].
@@ -1247,7 +1250,7 @@ have{lb_psiM lb_psiL ub_rhoML ubM} ubK: (#|K / K'|%g < 4)%N.
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') := char_norm_trans (der_char 1 K) nKU0.
+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) // /(_ <| _).
@@ -1257,10 +1260,9 @@ have isoU0: U0 \isog U0 / K'.
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) //.
- rewrite (subset_trans (Ohm_sub 1 _)) // subsetI sP0M.
- by rewrite (subset_trans sP0H) ?gFsub.
+ by rewrite gFsub_trans // subsetI sP0M (subset_trans sP0H) ?gFsub.
have /(Cauchy pr_p)[z U0z oz]: p %| #|U0 / K'|%g.
- by rewrite mem_primes in piU0p; case/and3P: piU0p.
+ 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.
@@ -1289,21 +1291,20 @@ 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=> P0 /SylowP[p _ sylP0].
-rewrite (odd_pgroup_rank1_cyclic (pHall_pgroup sylP0)) ?mFT_odd // leqNgt.
-apply/negP=> prankP0.
-have piUp: p \in \pi(U) by rewrite -p_rank_gt0 -(p_rank_Sylow sylP0) ltnW.
+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 sylP0} sylP0: p.-Sylow(M) P0 := subHall_Sylow hallU K'p sylP0.
-have{P0 sylP0 prankP0} prankM: (1 < 'r_p(M))%N by rewrite -(p_rank_Sylow sylP0).
-case/negP: K'p => /=.
-elim: {p}_.+1 {-2}p M @K (ltnSn p) maxM Mtype1 prankM => // p IHp q M K.
-rewrite ltnS leq_eqVlt => /predU1P[->{q} | /(IHp q M)//] maxM Mtype1 prankM.
-apply/idPn; rewrite -p'groupEpi /= -/K => p'K.
-have [P0 sylP0] := Sylow_exists p M.
-have [] := non_Frobenius_FTtype1_witness maxM Mtype1 prankM p'K sylP0.
-move=> abP0 prankP0 [L [maxL sP0_Ls [x P01s_x []]]].
-exact: (FTtype1_nonFrobenius_contradiction IHp) P01s_x.
+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). *)
diff --git a/mathcomp/odd_order/PFsection13.v b/mathcomp/odd_order/PFsection13.v
index 58e0142..6547dfd 100644
--- a/mathcomp/odd_order/PFsection13.v
+++ b/mathcomp/odd_order/PFsection13.v
@@ -1,16 +1,30 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
(******************************************************************************)
@@ -168,7 +182,7 @@ 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 _ _.
+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.
@@ -469,7 +483,7 @@ 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 exact: seqInd_on.
+ 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.
@@ -1533,10 +1547,9 @@ have ->: 'N(W2) = 'N_S(W2).
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 nPKW1: K <*> W1 \subset 'N(P).
- rewrite (subset_trans _ (gFnorm _ _)) // -(sdprodWY defS) genS ?setSU //.
- by rewrite subIset ?sUPU.
+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|.
@@ -2076,7 +2089,7 @@ have RealGammaL: cfReal GammaL.
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 _ _ _ irr_phi) ?odd_Frobenius_index_ler ?mFT_odd //.
+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.
diff --git a/mathcomp/odd_order/PFsection14.v b/mathcomp/odd_order/PFsection14.v
index bd7ae60..0056312 100644
--- a/mathcomp/odd_order/PFsection14.v
+++ b/mathcomp/odd_order/PFsection14.v
@@ -1,16 +1,30 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
(******************************************************************************)
@@ -331,7 +345,7 @@ 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 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.
@@ -343,7 +357,7 @@ suffices ->: '[X] = (a / v) ^+ 2 * (\sum_(xi <- calM) xi 1%g ^+ 2 / '[xi]).
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 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.
@@ -596,7 +610,7 @@ have{x ntx R0x ntCPx} sZR_R0: 'Z(R) \subset R0.
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 rewrite (subset_trans (Ohm_sub 1 _)).
+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.
@@ -605,9 +619,8 @@ have{sZR_R0 rR0_2} m12: pred2 1%N 2 m.
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.
- apply: char_trans (char_trans (Ohm_char 1 _) (center_char R)) _.
- by rewrite (nilpotent_Hall_pcore (Fcore_nil L) sylR) gFchar.
-have nR1W2y: W2 :^ y \subset 'N(R1) := char_norm_trans chR1H nHW2y.
+ 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.
@@ -619,10 +632,10 @@ 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)) => /implyP/leq_trans->; rewrite 2?ltnW.
-move/implyP; case/pred2P: m12 => ->; rewrite !big_ord_recl big_ord0 ?addn0 //=.
-by rewrite -(subnKC pgt2).
+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). *)
diff --git a/mathcomp/odd_order/PFsection2.v b/mathcomp/odd_order/PFsection2.v
index 9eef9e8..9ec3104 100644
--- a/mathcomp/odd_order/PFsection2.v
+++ b/mathcomp/odd_order/PFsection2.v
@@ -1,9 +1,16 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
(******************************************************************************)
@@ -55,7 +62,7 @@ Lemma partition_cent_rcoset (H : {group gT}) g (C := 'C_H[g]) (Cg := C :* 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; exact: rcoset_refl.
+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 //.
@@ -238,7 +245,7 @@ Qed.
Lemma Dade_support_norm : G \subset 'N(Atau).
Proof.
-by rewrite norms_bigcup //; apply/bigcapsP=> a _; exact: class_support_norm.
+by rewrite norms_bigcup //; apply/bigcapsP=> a _; apply: class_support_norm.
Qed.
Lemma Dade_support_normal : Atau <| G.
@@ -253,7 +260,7 @@ Fact Dade_subproof (alpha : 'CF(L)) :
Proof.
rewrite genGid; apply: intro_class_fun => [x y Gx Gy | x notGx].
congr (oapp _ _); apply: eq_pick => a; rewrite memJ_norm //.
- apply: subsetP Gy; exact: class_support_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.
@@ -355,9 +362,9 @@ have {1}<-: cover P_A = A.
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; exact: class_refl.
+ by apply/imsetP=> [[a _ /esym/eqP/set0Pn[]]]; exists a; apply: class_refl.
rewrite !rLid; apply: contraR => /pred0Pn[c /andP[/=]].
- by do 2!move/class_transr <-.
+ 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.
@@ -446,7 +453,7 @@ 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 exact: sdprod_compl.
+by apply: remgrM; first apply: sdprod_compl.
Qed.
Canonical Dade_restr_morphism B := Morphism (@Dade_restrM B).
Definition Dade_cfun_restriction B :=
@@ -573,7 +580,7 @@ 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; exact/andP.
+ 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.
@@ -581,7 +588,7 @@ apply: eq_big => x; rewrite ![x \in _]inE -!andbA.
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; exact: remgrMid.
+ 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).
@@ -605,9 +612,9 @@ transitivity (- (\sum_(B in calP) n1 B * aa1 B)); last first.
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].
+ apply/andP/idP=> [[_ /eqP <-] | /orbit_trans/(_ B1L_B)-B1L_B2].
by rewrite orbit_sym (mem_repr B2) ?orbit_refl.
- by rewrite [B2 :^: L](orbit_transl B1L_B2) -defB dB1L.
+ 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.
@@ -660,7 +667,7 @@ 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=> _; exact: setD1K.
+ 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.
@@ -672,7 +679,7 @@ symmetry; apply: eq_big => B.
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 => ->; exact: set11.
+ 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.
@@ -728,7 +735,7 @@ 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; exact: zchar_on.
+split; first by apply: sub_in2 Dade_isometry; apply: zchar_on.
by move=> phi Zphi; rewrite /= zchar_split Dade_vchar ?Dade_cfun.
Qed.
@@ -747,7 +754,7 @@ 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; [exact: sub_in1 defCa | exact: sub_in2 coHL].
+by exists H; [apply: sub_in1 defCa | apply: sub_in2 coHL].
Qed.
Local Notation ddA1 := restr_Dade_hyp.
diff --git a/mathcomp/odd_order/PFsection3.v b/mathcomp/odd_order/PFsection3.v
index 063aacc..c5633a2 100644
--- a/mathcomp/odd_order/PFsection3.v
+++ b/mathcomp/odd_order/PFsection3.v
@@ -1,11 +1,20 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
(******************************************************************************)
@@ -634,7 +643,7 @@ 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 exact: Uth2. Qed.
+Proof. by move=> Uth2 Uth1; split; last apply: Uth2. Qed.
(* Extend the orthonormal basis *)
diff --git a/mathcomp/odd_order/PFsection4.v b/mathcomp/odd_order/PFsection4.v
index 816ac05..887e6dd 100644
--- a/mathcomp/odd_order/PFsection4.v
+++ b/mathcomp/odd_order/PFsection4.v
@@ -1,9 +1,16 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
(******************************************************************************)
@@ -649,7 +656,7 @@ rewrite (card_afix_irr_classes Lz actsL_KK) => [|k x y Kx /=]; last first.
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_transr xKt); apply: mem_imset; have [y Ky Dt] := imsetP xKt.
+ 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.
@@ -776,7 +783,7 @@ Lemma prDade_irr_on k :
Proof.
move=> kerH'i; apply/cfun_onP=> g; rewrite !inE => /norP[ntg A'g].
have [Kg | /cfun0-> //] := boolP (g \in K).
-apply: not_in_ker_char0 (normalS _ _ nsHL) kerH'i _ => //.
+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.
@@ -894,7 +901,7 @@ Qed.
(* in part (a). *)
Theorem uniform_prTIred_coherent k (calT := uniform_prTIred_seq ptiWL k) :
k != 0 ->
- (*a*) [/\ pairwise_orthogonal calT, ~~ has cfReal calT, conjC_closed calT,
+ (*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)},
@@ -903,7 +910,7 @@ Theorem uniform_prTIred_coherent k (calT := uniform_prTIred_seq ptiWL k) :
/\ {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 exact: image_codom.
+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.
@@ -911,7 +918,7 @@ have oo_mu: pairwise_orthogonal (codom mu_).
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: conjC_closed calT.
+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].
@@ -938,7 +945,7 @@ have iso_f1: {in codom mu_, isometry f1, to 'Z[irr G]}.
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 oo_mu iso_f1.
+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].
diff --git a/mathcomp/odd_order/PFsection5.v b/mathcomp/odd_order/PFsection5.v
index 0c3b1eb..2031785 100644
--- a/mathcomp/odd_order/PFsection5.v
+++ b/mathcomp/odd_order/PFsection5.v
@@ -1,10 +1,18 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
(******************************************************************************)
@@ -26,7 +34,7 @@ Require Import PFsection1 PFsection2 PFsection3 PFsection4.
(* 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 *)
-(* introduces in Peterfalvi sections 5, 6, 7, and 9 to 14. *)
+(* 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 *)
@@ -122,10 +130,10 @@ 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; exact: imageP. Qed.
+Proof. by rewrite mem_undup; apply: imageP. Qed.
Lemma seqInd_on : {subset S <= 'CF(L, K)}.
-Proof. by move=> _ /seqIndP[i _ ->]; exact: cfInd_normal. Qed.
+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.
@@ -137,7 +145,7 @@ 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 _ ->]; exact: Ind_irr_neq0. Qed.
+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.
@@ -205,23 +213,23 @@ 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; exact: zchar_on (sub_seqInd_zchar Sphi Spsi). Qed.
+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; rewrite (card_imset_Ind_irr nsKL) => [|i|i y]; first 1 last.
+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.
-- rewrite !inE => S1iG Ly; congr (_ \in S1): S1iG.
- by apply: cfclass_Ind => //; apply/cfclassP; exists y; rewrite ?conjg_IirrE.
-congr (_ * _)%N; rewrite -(size_map (@cfIirr _ _)) -(card_uniqP _); last first.
- rewrite map_inj_in_uniq ?(subseq_uniq sS1S) ?seqInd_uniq //.
- by apply: (@can_in_inj _ _ _ _ (tnth (irr L))) => phi /irrS1/cfIirrE.
-apply: eq_card => s; apply/mapP/imsetP=> [[phi S1phi ->] | [i]].
- have /seqIndP[i _ Dphi] := mem_subseq sS1S S1phi.
+- 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 rewrite inE => S1iG ->; exists ('Ind 'chi_i).
+by apply: map_f; rewrite inE in S1iG.
Qed.
Section Beta.
@@ -333,10 +341,19 @@ 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; exact: Iirr_kerDS (sub1G M) sHK. Qed.
+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.
@@ -372,7 +389,7 @@ 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=> [[/(nth_index 0){2}<- /eqP->] | -> //]; exact: nth_index.
+by apply/andP/eqP=> [[Sj /eqP/(congr1 (nth 0 S))] | ->]; rewrite ?nth_index.
Qed.
Section Odd.
@@ -381,7 +398,7 @@ Hypothesis oddL : odd #|L|.
Lemma seqInd_conjC_ortho : {in S, forall phi, '[phi, phi^*] = 0}.
Proof.
-by move=> _ /seqInd_sub/seqIndC1P[i nzi ->]; exact: odd_induced_orthogonal.
+by move=> _ /seqInd_sub/seqIndC1P[i nzi ->]; apply: odd_induced_orthogonal.
Qed.
Lemma seqInd_conjC_neq : {in S, forall phi, phi^* != phi}%CF.
@@ -393,6 +410,13 @@ 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).
@@ -408,14 +432,6 @@ rewrite !inE -(inj_eq irr_inj) conjC_IirrE -Dchi seqInd_conjC_neq //.
by rewrite cfAut_seqInd Schi.
Qed.
-Lemma seqInd_nontrivial : (size S > 1)%N.
-Proof.
-apply: (@leq_trans (size [seq 'chi_i | i in [pred i | 'chi_i \in S]])).
- by rewrite size_map -cardE -cardsE seqInd_nontrivial_irr.
-apply: uniq_leq_size => [| _ /imageP[i Schi_i ->] //].
-exact/dinjectiveP/(in2W irr_inj).
-Qed.
-
End Odd.
End SeqIndD.
@@ -445,18 +461,19 @@ Variables L G : {group gT}.
(* 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) - *)
-(* belom. *)
+(* 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 "linear" one. *)
+(* 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 being given by *)
-(* the Smith normal form (see intdiv.v). The weaker requirement lets us *)
-(* use the dual_iso construction when size S = 2. *)
+(* 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^#]. *)
@@ -469,7 +486,7 @@ Definition coherent S A tau := exists tau1, coherent_with S A tau tau1.
(* 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 & conjC_closed S],
+ [/\ (*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}),
@@ -493,7 +510,7 @@ Lemma subgen_coherent S1 S2 A tau:
Proof.
move/zchar_trans=> sS21 [tau1 [[Itau1 Ztau1] def_tau]].
exists tau1; split; last exact: sub_in1 def_tau.
-by split; [exact: sub_in2 Itau1 | exact: sub_in1 Ztau1].
+by split; [apply: sub_in2 Itau1 | apply: sub_in1 Ztau1].
Qed.
Lemma subset_coherent S1 S2 A tau:
@@ -507,7 +524,7 @@ Lemma subset_coherent_with S1 S2 A tau (tau1 : {additive 'CF(L) -> 'CF(G)}) :
coherent_with S1 A tau tau1.
Proof.
move=> /zchar_subset sS12 [Itau1 Dtau1].
-by split=> [|xi /sS12/Dtau1//]; exact: sub_iso_to Itau1.
+by split=> [|xi /sS12/Dtau1//]; apply: sub_iso_to Itau1.
Qed.
Lemma perm_eq_coherent S1 S2 A tau:
@@ -555,12 +572,66 @@ 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; exact: zchar_trans_on.
+ 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). *)
@@ -569,12 +640,11 @@ Lemma irr_subcoherent (L G : {group gT}) S tau :
{in 'Z[S, L^#], isometry tau, to 'Z[irr G, G^#]} ->
{R | subcoherent S tau R}.
Proof.
-case=> U_S irrS ccS nrS [isoL Ztau].
-have N_S: {subset S <= character} by move=> _ /irrS/irrP[i ->]; exact: irr_char.
-have vcS: {subset S <= 'Z[irr L]} by move=> chi /N_S/char_vchar.
-have o1SS: orthonormal S by exact: sub_orthonormal (irr_orthonormal L).
-have [[_ dotSS] oSS] := (orthonormalP o1SS, orthonormal_orthogonal o1SS).
-have freeS := orthogonal_free oSS.
+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.
@@ -588,17 +658,17 @@ have R chi: {R : 2.-tuple 'CF(G) | (chi \in S) ==> sum_beta chi R && Zortho 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; [exact/eqP | exact/allP | ].
+ 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' _] _.
+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].
+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.
@@ -644,9 +714,9 @@ have Itau: {in 'Z[S, L^#], isometry tau, to 'Z[irr G, G^#]}.
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; exact: filter_subseq.
+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; exact: orthogonal_free.
+ 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.
@@ -709,7 +779,7 @@ exists R; split=> [|phi w S1phi irr_w|j]; first 1 last.
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 exact: irr_vchar.
+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 ->].
@@ -718,19 +788,19 @@ 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; exact: seqInd_char.
+- 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 => /orP.
- by case=> /codomP[i ->]; rewrite ?rpredN rpredZsign Zsig.
+ - 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; exact: opp_isometry.
+ 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.
@@ -755,9 +825,8 @@ 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 andbC orthogonal_oppl.
-rewrite !orthogonal_catr !orthogonal_oppr !odsw ?(inj_eq (aut_Iirr_inj _)) //.
-by rewrite (inv_eq (@conjC_IirrK _ _)).
+rewrite orthogonal_catl orthogonal_oppl !orthogonal_catr !orthogonal_oppr.
+by rewrite !odsw ?(inv_eq (@conjC_IirrK _ _)) ?conjC_IirrK.
Qed.
Section SubCoherentProperties.
@@ -780,7 +849,7 @@ 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; exact: sub_in1 (hasPn nrS).
+ by apply/hasPn; apply: sub_in1 (hasPn nrS).
- by apply: sub_iso_to Itau => //; apply: zchar_subset.
exact: sub_pairwise_orthogonal oS.
Qed.
@@ -822,7 +891,7 @@ Lemma subcoherent_norm chi psi (tau1 : {additive 'CF(L) -> 'CF(G)}) X 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.
+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.
@@ -834,34 +903,32 @@ 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 '[S0`_0, S0`_1].
- rewrite [rhs in _ = rhs]cfdotC cfdotBl !cfdotBr ochi_psi ochic_psi.
- by rewrite (oSS _ _ Schic) // !subr0 -cfdotC.
- rewrite -Itau1 ?mem_zchar ?mem_nth // tau1dchi tau_dchi cfdot_sumr.
- exact: eq_big_seq.
-have nX: '[X1] <= '[X] ?= iff (X == X1).
- rewrite -subr_eq0 -{1 2}[X](subrK X1) cfnormDd.
- rewrite -lerif_subLR subrr -cfnorm_eq0 eq_sym.
- by apply: lerif_eq; apply: cfnorm_ge0.
- rewrite defX1 cfdot_sumr big1_seq // => xi Rxi; rewrite cfdotZr cfdotBl.
- rewrite cfproj_sum_orthonormal // -[X](subrK Y) cfdotDl -defXY dotS00R //.
- by rewrite (orthoPl oYR) // addr0 subrr mulr0.
+ 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.
- apply/lerifP; rewrite /is01a; have /CintP[b ->] := Za xi.
- rewrite -intr_norm -rmorphX ltr_int intr_eq0 pmulrn !eqr_int.
- by case: b => [[|[|n]]|] //=; rewrite ltr_eexpr.
-have{nchi nX} part_a: '[chi] <= '[X] ?= iff all is01a (R chi) && (X == X1).
- apply: lerif_trans nX; rewrite nchi defX1 cfnorm_sum_orthonormal //.
+ 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 (filter [preim a of predC1 0] (R chi)); first exact: filter_subseq.
+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 /a01/eqP{1}->; rewrite scaler_nat -mulrb.
+by apply: eq_big_seq => xi Rxi; rewrite -mulrb -scaler_nat -(eqP (a01 _ _)).
Qed.
(* This is Peterfalvi (5.5). *)
@@ -871,7 +938,7 @@ Lemma coherent_sum_subseq chi (tau1 : {additive 'CF(L) -> 'CF(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'.
+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).
@@ -882,7 +949,7 @@ 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 /orthogonal /= !cfdot0r eqxx Schi cfun0_zchar.
+- 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.
@@ -895,11 +962,11 @@ Corollary mem_coherent_sum_subseq S1 chi (tau1 : {additive 'CF(L) -> 'CF(G)}) :
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 exact: ccS1.
+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.
-by have [[charS _ _] _ _ _ _] := cohS => /charS/char_vchar.
+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). *)
@@ -946,58 +1013,50 @@ 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{N_S1} nz_chi1: chi 1%g != 0; last move/mem_zchar in S1chi.
+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.
-pose S3 := S1 ++ S2; pose Y := map tau1 S1 ++ map tau2 S2.
-have oS33: pairwise_orthogonal S3 by rewrite pairwise_orthogonal_cat oS11 oS22.
-have oYY: pairwise_orthogonal Y.
+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=> xi_tau; rewrite mem_cat => /orP[] /mapP[xi Sxi ->] {xi_tau}.
- by rewrite Ztau1 ?mem_zchar.
- by rewrite Ztau2 ?mem_zchar.
-have nY: map cfnorm Y = map cfnorm (S1 ++ S2).
+ 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 /eqP defY ZItau3] := Zisometry_of_cfnorm oS33 oYY nY Z_Y.
-exists tau3; split=> {ZItau3}// xi; rewrite zcharD1E /= => /andP[S3xi].
+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:= defY; rewrite map_cat eqseq_cat ?size_map // => /andP[].
- by split; apply/eq_in_map/eqP.
-have{S3xi} [xi1 [xi2 [Sxi1 Sxi2 ->] {xi}]]:
- exists xi1, exists xi2, [/\ xi1 \in 'Z[S1], xi2 \in 'Z[S2] & xi = xi1 + xi2].
-- have uS3 := free_uniq (orthogonal_free oS33).
- have [z Zz ->] := zchar_expansion uS3 S3xi; rewrite big_cat.
- pose Y_ S4 := \sum_(mu <- S4) z mu *: mu.
- suffices ZS_Y S4: Y_ S4 \in 'Z[S4] by exists (Y_ S1), (Y_ S2).
- by rewrite /Y_ big_seq rpred_sum // => psi /mem_zchar/rpredZ_Cint->.
-rewrite cfunE addrC addr_eq0 linearD => /eqP xi2_1.
-transitivity (tau1 xi1 + tau2 xi2).
- have [z1 Zz1 ->] := zchar_nth_expansion Sxi1.
- have [z2 Zz2 ->] := zchar_nth_expansion Sxi2.
- rewrite !raddf_sum; congr(_ + _); apply: eq_bigr => i _;
- by rewrite !raddfZ_Cint -?(defY1, defY2) ?mem_nth.
-have Z_S1_1 zeta: zeta \in 'Z[S1] -> zeta 1%g \in Cint.
- move=> Szeta; rewrite Cint_vchar1 // (zchar_sub_irr _ Szeta) {zeta Szeta}//.
- by move=> zeta /sS1S Szeta; apply: char_vchar; have [[->]] := cohS.
-have [Zchi1 Zxi1] := (Z_S1_1 _ S1chi, Z_S1_1 _ Sxi1).
-apply: (scalerI nz_chi1); rewrite scalerDr -!raddfZ_Cint // scalerDr.
-rewrite -[_ *: _](subrK (xi1 1%g *: chi)) raddfD -[_ + _]addrA.
-rewrite -[rhs in _ = tau rhs]addrA linearD Dtau1; last first.
- by rewrite zcharD1E rpredB ?rpredZ_Cint ?Z_S1_1 //= !cfunE mulrC subrr.
-congr (_ + _); rewrite -[_ *: xi2](addKr (xi1 1%g *: phi)) (raddfD tau2).
-rewrite [_ + _]addrA [rhs in tau rhs]addrA linearD; congr (_ + _); last first.
- rewrite Dtau2 // zcharD1E rpredD ?rpredZ_Cint ?Z_S1_1 //=.
- by rewrite !cfunE mulrC xi2_1 chi1_phi mulrN subrr.
-rewrite raddfN (raddfZ_Cint tau1) // (raddfZ_Cint tau2) // -!scalerBr linearZ.
-by congr (_ *: _).
+ 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). *)
+(* 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] ->
@@ -1061,15 +1120,16 @@ apply: (bridge_coherent sS20 cohS2 sS10 cohS1) => //.
by rewrite mem_head (zchar_on Zbeta) rpredZ_Cint ?mem_zchar.
Qed.
-(* This is Peterfalvi (5.6). *)
+(* 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] ->
+ 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].
+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.
@@ -1077,7 +1137,7 @@ 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 exact: sub_pairwise_orthogonal oS.
+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.
@@ -1093,7 +1153,9 @@ have Zachi: chi - a *: xi1 \in 'Z[S, L^#].
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).
-have oX1: pairwise_orthogonal X1 by exact: map_pairwise_orthogonal.
+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.
@@ -1124,66 +1186,39 @@ have [lam Zlam [Z oZS1 defY]]:
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.
+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{defY leXchi lam Z Zlam oZS1 ub_chi1} defY: Y = a *: tau1 xi1.
- have nXY: '[X] + '[Y] = '[chi] + '[a *: xi1].
- by rewrite -!cfnormBd // ?cfdotZr ?ocS1 ?mulr0 // -eqXY Itau.
- have{leXchi nXY}: '[Y] <= a ^+ 2 * '[xi1].
- by rewrite -(ler_add2l '[X]) nXY 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 -subr_ge0 cfnormB cfnormZ Cint_normK // Itau1 ?Z_S1 //.
- rewrite -2!addrA (opprD (_ * _)) addNKr cfnormZ Cint_normK // oppr_ge0.
- rewrite cfnorm_sum_orthogonal //; set sum_a := \sum_(xi <- _) _.
- rewrite -cfdotC cfdotC cfdotZl cfdotZr cfproj_sum_orthogonal ?map_f // a_xi1.
- rewrite Itau1 ?Z_S1 // 3!rmorphM !(aut_Cint _ Za) fmorphV aut_Cint //.
- rewrite -cfdotC -mulr2n 2!mulrA divfK ?nz_nS1 // -mulrnAr addrA => ub_lam.
- have [lam0 | nz_lam] := eqVneq lam 0.
- suffices /eqP->: Z == 0 by rewrite lam0 scale0r subr0 addr0.
- rewrite -cfnorm_eq0 eqr_le cfnorm_ge0 andbT.
- by rewrite lam0 -mulrA !mul0r subrr add0r in ub_lam.
- set d := \sum_(xi <- _) _ in ub_chi1; pose b := 2%:R * chi 1%g * xi1 1%g / d.
- have pos_S1_1 := Cnat_ge0 (Cnat_char1 (N_S _ (sS1S _ _))).
- have xi11_gt0: 0 < xi1 1%g by rewrite ltr_def nz_xi11 pos_S1_1.
- have d_gt0: 0 < d.
- have a_xi_ge0 xi: xi \in S1 -> 0 <= xi 1%g ^+ 2 / '[xi].
- by move/pos_S1_1 => xi_1_pos; rewrite 2?mulr_ge0 // invr_ge0 cfnorm_ge0.
- rewrite [d]big_seq; case defS1: {1 2}S1 S1xi1 => // [xi S1'] _.
- have{defS1} S1xi: xi \in S1 by rewrite defS1 mem_head.
- rewrite big_cons S1xi ltr_spaddl ?sumr_ge0 // ltr_def a_xi_ge0 //=.
- by rewrite !mulf_neq0 ?invr_eq0 ?char1_eq0 -?cfnorm_eq0 ?nz_nS1 ?N_S ?sS1S.
- have nz_d: d != 0 by rewrite eqr_le ltr_geF.
- have b_gt0: 0 < b.
- rewrite !pmulr_rgt0 ?ltr0n ?invr_gt0 // lt0r.
- by rewrite Cnat_ge0 ?Cnat_char1 ?char1_eq0 ?N_S // nzS.
- have{ub_chi1} b_lt1: b < 1 by rewrite ltr_pdivr_mulr ?mul1r.
- have{ub_lam} ub_lam: lam ^+ 2 <= b * lam.
- rewrite -(ler_pmul2r d_gt0) (mulrAC b) divfK //.
- rewrite -[d](divfK (mulf_neq0 nz_xi11 nz_xi11)) chi1 mulr_natl -mulrnAl.
- rewrite !mulrA 2!(mulrAC _ _ lam) 2?ler_pmul2r // -mulrA -expr2.
- have ->: d / xi1 1%g ^+ 2 = sum_a.
- rewrite big_distrl /sum_a big_map !big_seq; apply: eq_bigr => xi S1xi /=.
- rewrite a_E // Itau1 ?Z_S1 //= (normr_idP _); last first.
- by rewrite !(cfnorm_ge0, mulr_ge0, invr_ge0) ?pos_S1_1.
- rewrite mulrAC 2!exprMn -!exprVn [p in p * '[xi]]mulrA.
- by rewrite divfK ?nz_nS1.
- rewrite -subr_ge0 -opprB oppr_ge0 (ler_trans _ ub_lam) //.
- by rewrite (mulrC lam) -{1}[_ - _]addr0 ler_add2l cfnorm_ge0.
- have lam_gt0: 0 < lam.
- rewrite ltr_def nz_lam -(ler_pmul2l b_gt0) mulr0.
- by apply: ler_trans ub_lam; rewrite -Cint_normK // mulr_ge0 ?normr_ge0.
- rewrite ler_pmul2r // ltr_geF // in ub_lam.
- rewrite (ltr_le_trans b_lt1) //; have:= lam_gt0.
- have /CnatP[n ->]: lam \in Cnat by rewrite CnatEint Zlam ltrW.
- by rewrite ltr0n ler1n.
-by move: eqXY; rewrite defY; apply: extend_coherent_with => //; rewrite -defY.
+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). *)
@@ -1191,153 +1226,119 @@ Qed.
(* 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 => /= [|chi S1] szS; first by rewrite defS; exact: nil_coherent.
-have{szS} unifS xi: xi \in S -> xi 1%g = chi 1%g.
+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 Schi: chi \in S by rewrite defS mem_head.
+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 freeS := orthogonal_free oS.
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.
-have [neq_chic Schic] := (hasPn nrS _ Schi, ccS _ Schi).
-have [/andP[/memPn notS0 _] ooS] := pairwise_orthogonalP oS.
-pose S' xi := [predD1 S & xi]; pose S'c xi := predD1 (S' xi) xi^*%CF.
-have{oR} oR xi1 xi2: xi1 \in S -> xi2 \in S'c xi1 -> orthogonal (R xi1) (R xi2).
- move=> Sxi1 /and3P[/= neq_xi21c neq_xi21 Sxi2].
- by rewrite orthogonal_sym oR // /orthogonal /= !ooS ?eqxx // ccS.
+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 ooS ?ccS // -[_ == _]negbK eq_sym (hasPn nrS).
-pose D xi := tau (chi - xi).
-have Z_D xi: xi \in S -> D xi \in 'Z[irr G] by move/(Zd _ _ Schi)/Ztau/zcharW.
-have /CnatP[N defN]: '[chi] \in Cnat by rewrite Cnat_cfdot_char ?N_S.
-have dotD: {in S' chi &, forall xi1 xi2, '[D xi1, D xi2] = N%:R + '[xi1, xi2]}.
-- move=> xi1 xi2 /andP[ne_xi1chi Sxi1] /andP[ne_xi2chi Sxi2].
+ 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?ooS // 1?eq_sym // opprB !subr0.
-have /R_P[ZRchi o1Rchi defRchi] := Schi; have frRchi := orthonormal_free o1Rchi.
-have szRchi: size (R chi) = (N + N)%N.
+ 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 sub_Rchi X := exists2 E, subseq E (R chi) & X = \sum_(a <- E) a.
-pose Xspec X := [/\ X \in 'Z[R chi], '[X]_G = N%:R & sub_Rchi X].
-pose Xi_spec X xi := X - D xi \in 'Z[R xi] /\ '[X, D xi] = N%:R.
-have haveX xi: xi \in S'c chi -> exists2 X, Xspec X & Xi_spec X xi.
- move=> S'xi; have /and3P[/= ne_xi_chi' ne_xi_chi Sxi] := S'xi.
+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 Schi (Z_D _ Sxi).
- have [eqXY1 oXY1 oY1chi] := defXY1; have sRchiX := zchar_span RchiX.
+ 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].
- rewrite -[Y1](subrK X) -opprB -eqXY1 addrC rpredB ?Z_D //.
- exact: (zchar_trans ZRchi).
- have [X1 RxiX1 [Y defX1Y]] := subcoherent_split Sxi Z_Y1; pose Y2 := X + Y.
- have [eqX1Y oX1Y oYxi] := defX1Y; pose D2 := tau (xi - chi).
- have oY2Rxi: orthogonal Y2 (R xi).
- apply/orthogonalP=> _ phi /predU1P[-> | //] Rxi_phi.
- rewrite cfdotDl (orthoPl oYxi) // addr0.
- by rewrite (span_orthogonal (oR _ _ _ S'xi)) // (memv_span Rxi_phi).
+ 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 //= !ooS ?eqxx // eq_sym.
+ - 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 //= !ooS ?eqxx //.
- by rewrite (inv_eq (@cfConjCK _ _)).
+ - 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.
- have span_head := memv_span (mem_head _ _); have sRxiX1 := zchar_span RxiX1.
- have Y0: Y = 0.
- apply/eqP; rewrite -cfnorm_eq0 eqr_le cfnorm_ge0 andbT.
- rewrite -(ler_add2l ('[X] + '[X1])) -!addrA.
- rewrite -2?cfnormBd -?eqX1Y -?eqXY1 ?addr0; first last.
- - by rewrite cfdotC (span_orthogonal oYxi) ?rmorph0 ?span_head.
- - by rewrite cfdotC (span_orthogonal oY1chi) ?rmorph0 ?span_head.
- by rewrite dotD ?inE ?ne_xi_chi // -defN ler_add.
- rewrite eqX1Y Y0 subr0 defN in eqX1.
- have [nX _ defX] := eqX1 minX1; exists X => //; red.
- rewrite eqXY1 eqX1Y Y0 subr0 opprD opprK addNKr cfdotBr nX.
- by rewrite (span_orthogonal (oR _ _ _ S'xi)) ?subr0 ?(zchar_span RxiX1).
-pose X_spec X := forall xi, X - D xi \in 'Z[irr G] /\ '[X, D xi] = N%:R.
-have [X [RchiX nX defX] X_S'c]: exists2 X, Xspec X & {in S'c chi, X_spec X}.
- have [S_chi | /allPn[xi1 Sxi1]] := altP (@allP _ (pred2 chi chi^*%CF) S).
- pose E := take N (R chi); pose Ec := drop N (R chi).
- have eqRchi: E ++ Ec = R chi by rewrite cat_take_drop.
- have:= o1Rchi; rewrite -eqRchi orthonormal_cat => /and3P[onE onEc oEEc].
- exists (\sum_(a <- E) a) => [|xi /and3P[? ? /S_chi/norP[] //]].
- split; last by exists E; rewrite // -[E]cats0 -eqRchi cat_subseq ?sub0seq.
- rewrite big_seq rpred_sum // => a Ea.
- by rewrite mem_zchar // -eqRchi mem_cat Ea.
- by rewrite cfnorm_orthonormal //= size_takel ?szRchi ?leq_addl.
- case/norP=> ne_xi1chi ne_xi1chi'; have S'xi1: xi1 \in S'c chi by exact/and3P.
- have [X [RchiX nX defX] [Rxi1X1 XD_N]] := haveX _ S'xi1.
- exists X => // xi S'xi; have [ne_xi_chi' ne_xi_chi /= Sxi] := and3P S'xi.
- have /R_P[ZRxi _ _] := Sxi; have /R_P[ZRxi1 _ defRxi1] := Sxi1.
- have [-> | ne_xi_xi1] := eqVneq xi xi1; first by rewrite (zchar_trans ZRxi1).
+ 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 [-> | ne_xi_xi1'] := eqVneq xi xi1^*%CF.
- rewrite /D -[chi](subrK xi1) -addrA linearD cfdotDr XD_N opprD addrA.
- rewrite defRxi1 big_seq (span_orthogonal (oR _ _ _ S'xi1)) ?addr0 //.
- by rewrite rpredB ?rpred_sum // (zchar_trans ZRxi1).
- by rewrite memv_suml // => a /memv_span.
- have [X' [RchiX' nX' _] [RxiX' X'D_N]] := haveX _ S'xi.
- have [ZXi sRxiX'] := (zchar_trans ZRxi RxiX', zchar_span RxiX').
+ 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->.
- rewrite cfnormB subr_eq0 nX nX' aut_Cint -?mulr2n; last first.
- by rewrite Cint_cfdot_vchar ?(zchar_trans ZRchi).
- apply/eqP; congr (_ *+ _); transitivity '[D xi1, D xi].
- by rewrite dotD ?inE ?ne_xi_chi ?ne_xi1chi ?ooS ?addr0 // eq_sym.
- rewrite -[D xi](subrK X') -opprB addrC -[D _](subrK X) -opprB addrC.
- rewrite cfdotBr cfdotBl -addrA addrC -addrA addrCA cfdotBl opprB.
+ 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 chi xi _ _)) // subrr add0r.
- rewrite cfdotC (span_orthogonal (oR chi xi1 _ _)) ?rmorph0 ?oppr0 ?add0r //.
- exact: (zchar_span RchiX').
-have ZX: X \in 'Z[irr G] := zchar_trans ZRchi RchiX.
-have{defX X_S'c} X_S': {in S' chi, X_spec X}.
- move=> xi.
- have [-> _| ne_xi_chi' S'xi] := eqVneq xi chi^*%CF; last exact/X_S'c/andP.
- rewrite /D defRchi {1}big_seq rpredB ?rpred_sum //.
- have{defX} [E sER defX] := defX; pose Ec := filter [predC E] (R chi).
- have eqRchi: perm_eq (R chi) (E ++ Ec).
- by rewrite -(perm_filterC (mem E)) -(subseq_uniqP _ _) ?free_uniq.
- have:= o1Rchi; rewrite (eq_orthonormal eqRchi) orthonormal_cat.
- case/and3P=> onE _ oEEc.
- rewrite (eq_big_perm _ eqRchi) big_cat /= -defX cfdotDr nX defX !big_seq.
- by rewrite (span_orthogonal oEEc) ?addr0 // memv_suml // => ? /memv_span.
-pose X_ xi := X - D xi.
-have X_chi: X_ chi = X by rewrite /X_ /D subrr linear0 subr0.
-have{X_S'} ZI_X: {in S, isometry X_, to 'Z[irr G]}.
- have dotXD_N xi: xi \in S' chi -> '[X, D xi] = N%:R by case/X_S'.
- have S_S': {subset S <= [predU1 chi & [predD1 S' chi & chi]]}.
- by move=> xi; rewrite !inE; case: eqP.
- split=> [xi1 xi2 Sxi1 Sxi2 | xi]; last first.
- by case/S_S'/predU1P=> [-> | /andP[_ /X_S'[]//]]; rewrite X_chi.
- have /predU1P[-> | /andP[chi'xi1 S'xi1]] := S_S' _ Sxi1.
- have /predU1P[->|/andP[chi'xi2 S'xi2]] := S_S' _ Sxi2; rewrite X_chi ?nX //.
- by rewrite cfdotBr nX dotXD_N // subrr ooS // eq_sym.
- have /predU1P[->|/andP[chi'xi2 S'xi2]] := S_S' _ Sxi2.
- by rewrite X_chi cfdotBl nX cfdotC dotXD_N // rmorph_nat subrr ooS.
- rewrite cfdotBl !cfdotBr nX (cfdotC _ X) !dotXD_N // conjC_nat.
- by rewrite opprB subrr add0r dotD // addrC addKr.
-have [tau1 Dtau1 Itau1] := Zisometry_of_iso oS ZI_X.
-exists tau1; split=> // xi; rewrite zcharD1E.
-case/andP=> /zchar_expansion[|z Zz ->{xi}]; first exact: free_uniq.
-rewrite defS big_cons /= !cfunE addr_eq0 => eq_z.
-have{eq_z} ->: z chi = - \sum_(xi <- S1) z xi.
- have nz_chi1: chi 1%g != 0 by rewrite char1_eq0 ?N_S // notS0.
- apply: (mulIf nz_chi1); rewrite (eqP eq_z) sum_cfunE mulNr mulr_suml.
- congr (- _); apply: eq_big_seq => xi S1xi.
- by rewrite cfunE unifS // defS !inE S1xi orbT.
-rewrite scaleNr scaler_suml addrC -opprB -sumrB !linearN !linear_sum /=.
-apply: eq_big_seq => xi S1xi; rewrite -scalerBr !linearZ /= -/(D _).
-congr (_ *: - _); rewrite linearB !Dtau1 // ?defS 1?mem_behead //.
-by rewrite X_chi opprD addNKr opprK.
+ 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.
@@ -1512,7 +1513,7 @@ Local Notation "alpha ^u" := (cfAut u alpha).
(* 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 *)
+(* 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 ->
diff --git a/mathcomp/odd_order/PFsection6.v b/mathcomp/odd_order/PFsection6.v
index d74185a..7654743 100644
--- a/mathcomp/odd_order/PFsection6.v
+++ b/mathcomp/odd_order/PFsection6.v
@@ -1,11 +1,20 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
(******************************************************************************)
@@ -13,7 +22,7 @@ Require Import PFsection1 PFsection2 PFsection3 PFsection4 PFsection5.
(* Some Coherence Theorems *)
(* Defined here: *)
(* odd_Frobenius_quotient K L M <-> *)
-(* L has odd order, M <| L, K with K / M is nilpotent, and L / H1 is a *)
+(* 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. *)
@@ -30,7 +39,7 @@ Local Open Scope ring_scope.
Section Six.
Variables (gT : finGroupType) (G : {group gT}).
-Implicit Types H K L M : {group gT}.
+Implicit Types H K L P M W Z : {group gT}.
(* Grouping lemmas that assume Hypothesis (6.1). *)
Section GeneralCoherence.
@@ -51,7 +60,7 @@ 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 : conjC_closed (S M). Proof. exact: cfAut_seqInd. 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.
@@ -60,13 +69,11 @@ Lemma exists_linInd M :
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 /andP[_ r1] ntr] := solvable_has_lin_char ntKM (quotient_sol M solK).
-exists ('Ind[L, K] ('chi_r %% M)%CF); last first.
- by rewrite cfInd1 // cfModE // morph1 (eqP r1) mulr1.
-apply/seqIndP; exists (mod_Iirr r); last by rewrite mod_IirrE.
-rewrite !inE subGcfker mod_IirrE ?cfker_mod //= andbT.
-apply: contraNneq ntr => /(canRL (mod_IirrK nsMK))->.
-by rewrite quo_IirrE // irr0 ?cfker_cfun1 ?cfQuo_cfun1.
+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). *)
@@ -74,58 +81,42 @@ 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 ->
- (*b1*) coherent (S A) L^# tau ->
- (*b2*) coherent (S B) L^# tau
- \/ #|K : A|%:R - 1 <= 2%:R * #|L : C|%:R * sqrtC #|C : D|%:R.
+ (*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.
Proof.
move=> [nsAL nsBL nsCL nsDL] [ltAK sBD sDC sCK sDbZC] cohA.
-have [|not_ineq] := boolP (_ <= _); [by right | left].
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).
-pose wf S1 := [/\ uniq S1, {subset S1 <= calS} & conjC_closed S1].
-pose S1 := [::] ++ S A; set S2 := [::] in S1; rewrite -[S A]/S1 in cohA.
-have wfS1: wf S1 by split; [apply: uniqS | apply: sSS | apply: ccS].
-move: {2}_.+1 (ltnSn (size calS - size S1)) => n.
-elim: n => // n IHn in (S2) S1 wfS1 cohA *; rewrite ltnS => leSnS1.
-have [uniqS1 sS1S ccS1] := wfS1.
-have [sAB1 | /allPn[psi /= SBpsi notS1psi]] := altP (@allP _ (mem S1) (S B)).
- by apply: subset_coherent cohA.
-have [neq_psi_c SBpsic] := (hasPn nrS _ (sSS SBpsi), ccS SBpsi).
-have wfS1': wf [:: psi, psi^* & S1]%CF.
- split=> [|xi|xi]; rewrite /= !inE 1?andbC.
- - rewrite negb_or eq_sym neq_psi_c notS1psi uniqS1 (contra (ccS1 _)) //.
- by rewrite cfConjCK.
- - by case/predU1P=> [|/predU1P[|/sS1S]] -> //; rewrite (@sSS B).
- do 2![case/predU1P=> [-> |]; first by rewrite ?cfConjCK eqxx ?orbT // eq_sym].
- by move/ccS1=> ->; rewrite !orbT.
-apply: (IHn [:: psi, psi^* & S2]%CF) => //; last first.
- rewrite -subSn ?uniq_leq_size //; try by case: wfS1'.
- by rewrite /= subSS (leq_trans _ leSnS1) // leq_sub2l ?leqW.
+rewrite real_lerNgt ?rpredB ?ger0_real ?mulr_ge0 ?sqrtC_ge0 ?ler0n //.
+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: [/\ phi \in S1, psi \in calS & psi \notin S1].
- by rewrite mem_cat SAphi orbT (@sSS B).
-have /seqIndP[i /setDP[kBi _] def_psi] := SBpsi; rewrite inE in kBi.
-move/(extend_coherent scohS); apply; rewrite // {phi SAphi}phi1; split=> //.
- by rewrite def_psi cfInd1 // dvdC_mulr // CintE Cnat_irr1.
-have Spos xi: xi \in calS -> 0 <= xi 1%g by move/Cnat_seqInd1/Cnat_ge0.
-rewrite big_cat sum_seqIndD_square //= -subr_gt0 -addrA ltr_paddl //=.
- rewrite big_seq sumr_ge0 // => xi S2xi.
- by rewrite !mulr_ge0 ?invr_ge0 ?cfnorm_ge0 ?Spos ?sS1S // mem_cat S2xi.
-rewrite mulrC -mulrBl pmulr_rgt0 ?gt0CiG // subr_gt0.
-rewrite real_ltrNge ?rpredB ?rpredM ?rpred_nat ?rpred1 //; last first.
- by rewrite realE Spos ?(sSS SBpsi).
-apply: contra not_ineq => /ler_trans-> //.
-rewrite -mulrA ler_pmul2l ?ltr0n // def_psi cfInd1 //.
-rewrite -(Lagrange_index sKL sCK) natrM -mulrA ler_pmul2l ?gt0CiG //.
-exact: irr1_bound_quo sDbZC.
+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_coherent M H H1 :
+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)%g ->
+ (*a*) nilpotent (H / M) ->
(*b*) coherent (S H1) L^# tau ->
(*c*) (#|H : H1| > 4 * #|L : K| ^ 2 + 1)%N ->
coherent (S M) L^# tau.
@@ -144,41 +135,36 @@ suffices{m IHm leAm} cohB: coherent (S B) L^# tau.
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.
- have minBb: minnormal (A / B)%g (L / B)%g.
- apply/mingroupP; split=> [|Db /andP[ntDb nDLb] sDAb].
+ 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: Db <| (L / B)%g by rewrite /normal (subset_trans sDAb) ?quotientS.
- case/(inv_quotientN nsBL)=> D defDb sBD /andP[sDL nDL].
- apply: contraNeq ntDb => neqDAb; rewrite defDb quotientS1 //.
- case/maxgroupP: maxB => /= _ /(_ D) {1}<- //.
- rewrite -(quotient_proper (normalS sBD sDL nsBL)) // -defDb.
- by rewrite properEneq sDAb neqDAb.
- apply/setIidPl; case/mingroupP: minBb => /andP[ntAb nALb].
- apply; rewrite ?subsetIl //.
- have nZHb := char_norm_trans (center_char (H / B)) (quotient_norms _ nHL).
- rewrite andbC normsI //= meet_center_nil //=; last first.
- by rewrite quotient_normal // (normalS sAH sHL).
+ 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 [defA | ltAH] := eqVproper sAH.
- by rewrite addn1 defA indexgg in lbHA.
-have [sAK ltAK] := (subset_trans sAH sHK, proper_sub_trans ltAH sHK).
-case: (@coherent_seqIndD_bound A B H A) => // /idPn[].
-apply: contraL lbHA; rewrite -ltnNge -ltC_nat -(Lagrange_index sHK sAH) natrM.
-set x := #|H : A|%:R => ub_x.
-have nz_x2: sqrtC x != 0 by rewrite sqrtC_eq0 neq0CiG.
-have x2_gt0: 0 < sqrtC x by rewrite ltr_def nz_x2 sqrtC_ge0 ler0n.
-have{ub_x}: sqrtC x - (sqrtC x)^-1 <= (2 * #|L : K|)%:R.
- rewrite -(ler_pmul2r (gt0CiG K H)) -natrM -mulnA Lagrange_index //.
- rewrite natrM -(ler_pmul2r x2_gt0) mulrC mulrBl mulrBr.
- rewrite !mulrA -expr2 sqrtCK divff // (ler_trans _ ub_x) // mulrC.
- by rewrite ler_add2l ler_opp2 mul1r ler1n.
-rewrite -(@ler_pexpn2r _ 2) -?topredE /= ?ler0n //; last first.
- rewrite subr_ge0 -(ler_pmul2r x2_gt0) -expr2 mulVf // sqrtCK.
- by rewrite ler1n.
-rewrite -natrX expnMn -(ler_add2r 2%:R) -addnS natrD.
-apply: ltr_le_trans; rewrite sqrrB // exprVn sqrtCK divff //.
-by rewrite addrAC subrK addrC -subr_gt0 addrK invr_gt0 gt0CiG.
+have ltAH: A \proper H.
+ by rewrite properEneq sAH (contraTneq _ lbHA) // => ->; rewrite indexgg addn1.
+set x := 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). *)
@@ -189,101 +175,92 @@ Definition odd_Frobenius_quotient M (H1 := K^`(1) <*> M) :=
(* This is Peterfalvi (6.5). *)
Lemma non_coherent_chief M (H1 := (K^`(1) <*> M)%G) :
- odd_Frobenius_quotient M ->
- 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)%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 nilKb]; rewrite /= -(erefl (gval H1)) => frobLb.
+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 -> m == 1 %[mod e] -> 2 * e + 1 <= m)%N.
- move=> odd_m m_gt1; rewrite eqn_mod_dvd ?(ltnW m_gt1) //.
- rewrite -[m]odd_double_half odd_m subn1 /= -mul2n addn1 ltnS leq_pmul2l //.
- rewrite Gauss_dvdr; last by rewrite coprime_sym prime_coprime // dvdn2 odd_e.
- by apply: dvdn_leq; rewrite -(subnKC m_gt1).
-have nsH1L: H1 <| L by rewrite normalY // (char_normal_trans (der_char 1 K)).
-have sH1K: H1 \subset K by rewrite join_subG der_sub.
+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 _ #|L : K|%:R)/allP=> _ /mapP[chi Schi ->] /=.
+ apply/(@all_pred1_constant _ e%:R)/allP=> _ /mapP[chi Schi ->] /=.
have [i /setIdP[_]] := seqIndP Schi; rewrite inE join_subG -lin_irr_der1.
- by do 2![case/andP]=> _ /eqP chi1 _ ->; rewrite cfInd1 // chi1 mulr1.
-have sMH1: M \subset H1 by apply: joing_subr.
-have [ubK | lbK] := leqP; last by left; apply: bounded_seqIndD_coherent lbK.
+ 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.
- rewrite sqrnD expnMn (leq_ltn_trans ubK) // -subn_gt0 addKn.
+ apply: leq_ltn_trans ubK _; rewrite -subn_gt0 sqrnD expnMn addKn.
by rewrite !muln_gt0 indexg_gt0.
-have [-> | neqMH1] := eqVneq M H1; [by left | right].
-have{neqMH1} ltMH1: M \proper H1 by rewrite properEneq neqMH1.
have{frobLb} [[E1b frobLb] [sH1L nH1L]] := (existsP frobLb, andP nsH1L).
have [defLb ntKb _ _ /andP[sE1L _]] := Frobenius_context frobLb.
-have nH1K: K \subset 'N(H1) := subset_trans sKL nH1L.
-have chiefH1: chief_factor L H1 K.
+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 dv_e H3: H1 \subset H3 -> H3 \subset K -> L \subset 'N(H3) ->
- #|H3 : H1| == 1 %[mod e].
- - move=> sH13 sH3K nH3L; rewrite eqn_mod_dvd // subn1.
- rewrite /e -(index_quotient_eq _ sKL nH1L) ?subIset ?sH1K ?orbT //.
- rewrite -[#|_ : _|]divgS ?quotientS // -(sdprod_card defLb) mulKn //.
- rewrite -card_quotient ?(subset_trans (subset_trans sH3K sKL)) //.
- rewrite regular_norm_dvd_pred ?(subset_trans sE1L) ?quotient_norms //.
- apply: semiregular_sym; apply: sub_in1 (Frobenius_reg_compl frobLb).
- by apply/subsetP; rewrite setSD ?quotientS.
- have dv_H21 := dv_e H2 sH12 sH2K nH2L.
- have dv_KH2: #|K : H2| == 1 %[mod e].
- have:= dv_e K sH1K (subxx K) nKL; rewrite -(Lagrange_index sH2K sH12).
- by rewrite -modnMmr (eqP dv_H21) modnMmr muln1.
+ 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).
- have iK_gt1 H3 H4: H4 \proper H3 -> (#|H3 : H4| > 1)%N.
- by rewrite indexg_gt1 => /andP[].
- by rewrite -(Lagrange_index sH2K sH12) leq_mul ?mod1e_lb ?odd_iK ?iK_gt1.
-split=> //; have nMK := subset_trans sKL (normal_norm nsML).
+ 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.
- rewrite /= join_subG subxx andbT -quotient_der ?quotient_sub1 //.
- exact: subset_trans (der_sub 1 K) nMK.
-have /is_abelemP[p p_pr /and3P[pKb _ _]]: is_abelem (K / H1)%g.
+ 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 _] := pgroup_pdiv pKb ntKb.
-have iso3M := third_isog sMH1 (normalS sMK sKL nsML) (normalS sH1K sKL nsH1L).
-have pKM: p.-group (K / M)%g.
- have /dprodP[_ defKM cKMpp' tiKMpp'] := nilpotent_pcoreC p nilKb.
- rewrite -defKM (eqP (forall_inP (nilpotent_sol nilKb) 'O_p^'(_)%G _)).
- by rewrite mulg1 pcore_pgroup.
- have /isomP[inj_quo im_quo] := quotient_isom (cents_norm cKMpp') tiKMpp'.
- rewrite subsetI pcore_sub /= -(injmSK inj_quo) // (morphim_der _ 1) //.
- rewrite {inj_quo}im_quo /= -[Q in Q^`(1)%g]quotientMidl defKM.
- rewrite -quotient_der ?gFnorm ?quotientS //.
- rewrite -quotient_sub1 ?(subset_trans (pcore_sub _ _) (der_norm _ _)) //.
- rewrite -[(_ / _)%g]setIid coprime_TIg //.
- apply: pnat_coprime (quotient_pgroup _ (pcore_pgroup _ _)).
- apply: pgroupS (quotientS _ (pcore_sub _ _)) _.
- rewrite /= -quotient_der // -(quotientYidr (subset_trans (der_sub 1 K) nMK)).
- by rewrite (isog_pgroup _ iso3M) ?(normalS sMK sKL nsML).
-exists p => //; apply: contra not_abKb => e_dv_p1.
+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 iso3M).
- rewrite homg_quotientS ?gFnorm ?quotient_norms //=.
- rewrite quotientYidr ?(subset_trans (der_sub 1 K)) // quotient_der //.
- by rewrite (Phi_joing pKM) joing_subl.
+ 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 := dvdn_odd p_dv_Kb (quotient_odd _ (oddSg sKL oddL)).
-by rewrite mod1e_lb // ?eqn_mod_dvd ?prime_gt0 ?prime_gt1.
+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 : {group gT}) (calX := seqIndD K L Z 1) :
- odd_Frobenius_quotient 1%G ->
+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)]
@@ -306,16 +283,14 @@ split=> [chi|].
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 => // ->.
-have [|[]] := non_coherent_chief Frob_quo1.
- by apply: subset_coherent; apply: seqInd_sub.
-have [oddL _] := Frob_quo1; rewrite /= joingG1 => frobLb _ [p []].
-set e := #|L : K|; have e_gt0: (e > 0)%N by apply: indexg_gt0.
-have isoK1 := isog_symr (quotient1_isog K).
-rewrite (isog_abelian isoK1) {isoK1}(isog_pgroup _ isoK1).
-have [-> | ntK pK _ not_e_dv_p1] := eqsVneq K [1]; first by rewrite abelian1.
-have{ntK} [p_pr p_dv_K _] := pgroup_pdiv pK ntK.
+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: conjC_closed Y by apply: cfAut_seqInd.
+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.
@@ -345,7 +320,7 @@ have{homoY} /hasP[xi1 Yxi1 lt_xi1_chi]: has (fun xi => d xi < d chi)%N Y.
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': conjC_closed Y'.
+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.
@@ -354,22 +329,21 @@ have Xchi := sYX _ Ychi; have defY: perm_eq [:: chi, chi^*%CF & Y'] Y.
apply: perm_eq_coherent (defY) _.
have d_chic: d chi^*%CF = d chi.
by rewrite /d cfunE conj_Cnat // (Cnat_seqInd1 Xchi).
-have /andP[uniqY' Y'x1]: uniq Y' && (xi1 \in Y').
- rewrite !(inE, mem_rem_uniq) ?rem_uniq // Yxi1 andbT -negb_or.
+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 xi1P: [/\ xi1 \in Y', chi \in calS & chi \notin Y'].
- by rewrite Y'x1 sYS ?(inE, mem_rem_uniq) ?rem_uniq // eqxx andbF.
have sY'Y: {subset Y' <= Y} by move=> xi /mem_rem/mem_rem.
-apply: (extend_coherent scohS) xi1P _; first by split=> // xi /sY'Y/sYS.
+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''].
+ 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 pos_p n: (0 < p ^ n)%N by rewrite expn_gt0 prime_gt0.
+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.
@@ -386,10 +360,10 @@ have def_sum_xi1 S: {subset S <= calX} -> sum_xi1 S = (e ^ 2 * sum_p2d S)%:R.
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 pos_p.
+ 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] := char_normal_trans (der_char 1 K) nsKL.
+ 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.
@@ -412,9 +386,9 @@ Qed.
End GeneralCoherence.
(* This is Peterfalvi (6.7). *)
-(* In (6.8) we only know initially the P is Sylow in L; perhaps the lemma *)
-(* should be stated with this equivalent (but weaker) assumption. *)
-Lemma constant_irr_mod_TI_Sylow (Z L P : {group gT}) p i :
+(* 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]| } ->
@@ -461,7 +435,7 @@ have{actsGC} PdvKa i j s:
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_transr <-] := enum_valP k.
+ 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) //.
@@ -479,8 +453,8 @@ 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):
- kerZ l -> (phi z *+ a2 i1 i1 == phi 1%g + phi z *+ a2 i1 i2 %[mod #|P|])%A.
+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.
@@ -502,10 +476,10 @@ suffices Ea2 l (phi := 'chi[G]_l):
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.
-move=> kerZphi; pose alpha := 'omega_l['K_i1]; pose phi1 := phi 1%g.
+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].
+ 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.
@@ -540,7 +514,7 @@ have Dalpha2 i j: ~~ dC i Z^# -> ~~ dC j Z^# ->
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_transr.
+ 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]>.
@@ -554,7 +528,7 @@ have zG'z1: (z^-1 \notin z ^: G)%g.
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_transr <-.
+ 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 _ _) _)) //.
@@ -593,7 +567,7 @@ 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 : {group gT}) :
+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]
@@ -602,17 +576,17 @@ Theorem Sibley_coherence (L H W1 : {group gT}) :
prime_Dade_hypothesis G L H H H^# A0 defW] ->
coherent calS L^# tau.
Proof.
-set A := H^# => [][oddL nilH tiA] S tau structL.
-set case_c1 := [Frobenius L = H ><| W1] in structL.
-have sLG: L \subset G by have [_ _ /eqP <-] := and3P tiA; apply: subsetIl.
-have [defL ntH ntW1]: [/\ H ><| W1 = L, H :!=: 1 & W1 :!=: 1]%g.
- have [/Frobenius_context[]// | [W2 _ [A0 [W [defW []]]]]] := structL.
- by move=> _ [[-> -> _ _] [ntW2 /subG1_contra->]].
+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_irr: case_c1 -> {subset S <= irr L}.
+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.
@@ -620,608 +594,485 @@ 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 c2hyp := prime_Dade_hypothesis G L H H A A0 defW.
+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{structL} c2W2: ~~ case_c1 -> [/\ prime #|W2|, W2 \subset H^`(1)%G & c2hyp].
- case: structL => [-> // | [W20 [prW20 sW20H'] W20hyp] _].
- have{W20hyp} [A00 [W0 [defW0 W20hyp]]] := W20hyp.
- suffices /group_inj defW20: W2 :=: W20.
- have eqW0: W0 = W by apply: group_inj; rewrite -defW0 -defW20.
- rewrite -defW20 eqW0 in prW20 sW20H' defW0 W20hyp; split=> //.
- rewrite /c2hyp (eq_irrelevance defW defW0) /A0.
- by have [_ _ <-] := prDade_def W20hyp.
- have [[_ _ _ cycW1] [_ _ _ prW120] _] := prDade_prTI W20hyp.
- have [x defW1] := cyclicP cycW1; rewrite -defW2 /= defW1 cent_cycle prW120 //.
- by rewrite !inE defW1 cycle_id -cycle_eq1 -defW1 ntW1.
-have{c2W2} [prW2 sW2H' c2W2] := all_and3 c2W2.
-have{sW2H'} sW2H': W2 \subset H^`(1)%G.
- by have [/c1W2-> | /sW2H'//] := boolP case_c1; apply: sub1G.
-pose sigma := cyclicTIiso (c2W2 _).
-have [R scohS oRW]: exists2 R, subcoherent S tau R & forall c2 : ~~ case_c1,
+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 (normal_sub nsHL)).
+- 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].
- rewrite !defZS => /zchar_on Axi1 /zchar_on Axi2.
+ split=> [xi1 xi2|xi]; first rewrite !defZS => /zchar_on-Axi1 /zchar_on-Axi2.
exact: normedTI_isometry Axi1 Axi2.
- rewrite !zcharD1E => /andP[Zxi /eqP xi1_0].
- rewrite cfInd1 // xi1_0 mulr0 eqxx cfInd_vchar //.
- by apply: zchar_trans_on Zxi; apply: seqInd_vcharW.
- have [/= Hc1 | Hc2] := boolP (idfun case_c1).
- suffices [R]: {R | subcoherent S tau R} by exists R => // /negP[].
- by apply: irr_subcoherent => //; first by case: uccS (c1_irr Hc1).
- have ddA0 := c2W2 Hc2.
+ 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 => [|not_c1 phi w irrSphi irr_w]; last first.
+ exists R => [|c2 phi w irrSphi irr_w]; last first.
by rewrite /sigma -(cycTIiso_irrel ddA0) oRW.
- set tau0 := Dade _ in subcohR.
- have Dtau: {in 'CF(L, A), tau =1 tau0}.
- have nAL: L \subset 'N(A) by rewrite normD1 normal_norm.
- move=> phi Aphi; rewrite /tau0 -(restr_DadeE ddA0 (subsetUl _ _) nAL) //.
- by rewrite /restr_Dade Dade_Ind.
- have [Sok _ oSS Rok oRR] := subcohR; split=> // phi Sphi.
- have [ZR oNR <-] := Rok _ Sphi; split=> //.
- by rewrite Dtau ?irr_vchar_on ?sub_conjC_vchar ?(seqInd_vchar nsHL Sphi).
-have [nsH'H nsH'L] := (der_normal 1 H, char_normal_trans (der_char 1 H) nsHL).
-have [nH'L solH] := (normal_norm nsH'L, nilpotent_sol nilH).
-have ltH'H: H^`(1)%g \proper H by rewrite ?(nil_comm_properl nilH) ?subsetIidl.
+ 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|.
- have [/Frobenius_coprime// | /c2W2[_ [[_ _]]]] := boolP case_c1.
- by rewrite (coprime_sdprod_Hall_r defL).
-have oW1: #|W1| = #|L : H| by rewrite -divgS // -(sdprod_card defL) mulKn.
-have frobL1: [Frobenius L / H^`(1) = (H / H^`(1)) ><| (W1 / H^`(1))]%g.
+ 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 [/Frobenius_reg_ker-> //|] := boolP case_c1; first exact: sub1G.
- by case/c2W2=> _ [_ [_ _ _ ->]].
+ have [frobL | /c2_ptiL[_ [_ _ _ -> //]]] := boolP case_c1.
+ by rewrite (Frobenius_reg_ker frobL) ?sub1G.
have odd_frobL1: odd_Frobenius_quotient H L 1.
- have ? := FrobeniusWker frobL1.
- by split=> //=; rewrite ?joingG1 // normal1 sub1G quotient_nil.
+ 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.
- have [//| [_] [p []]] := non_coherent_chief nsHL solH scohS odd_frobL1.
- rewrite (isog_abelian (quotient1_isog H)) -(isog_pgroup p (quotient1_isog H)).
- by move=> /pgroup_p-> -> _; apply.
+ 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) *)
- have sylH: p.-Sylow(L) H.
- apply/and3P; split=> //; rewrite -oW1 p'natE // -prime_coprime //.
- by case/pgroup_pdiv: pH coHW1 => // _ _ [m ->]; rewrite coprime_pexpl.
- have [P sylP sHP] := Sylow_superset (subset_trans sHL sLG) pH.
- have [sPG pP _] := and3P sylP; have nilP := pgroup_nil pP.
- rewrite -(nilpotent_sub_norm nilP sHP) // (sub_normal_Hall sylH) //.
- exact: pgroupS (subsetIl P _) pP.
- by have [_ _ /eqP <-] := and3P tiA; rewrite normD1 setSI.
-pose caseA := 'Z(H) :&: W2 == [1].
-have caseB_P: ~~ caseA -> [/\ ~~ case_c1, W2 :!=: [1] & W2 \subset 'Z(H)].
- rewrite /caseA; have [-> |] := eqsVneq W2 [1]; first by rewrite setIg1 eqxx.
- have [/c1W2->/eqP[]// | /prW2 pW2 ->] := boolP case_c1.
- by rewrite setIC => /prime_meetG->.
-pose Z := if caseA then ('Z(H) :&: H^`(1))%G else W2.
-have /subsetIP[sZZ sZH']: Z \subset 'Z(H) :&: H^`(1)%g.
- by rewrite /Z; case: ifPn => // /caseB_P[/c2W2[]] *; apply/subsetIP.
-have caseB_cZL: ~~ caseA -> Z \subset 'Z(L).
- move=> inB; have [_ _ /subsetIP[sW2H cW2H]] := caseB_P inB.
- have [_ mulHW1 _ _] := sdprodP defL.
- rewrite /Z (negPf inB) subsetI (subset_trans sW2H) //.
- by rewrite -mulHW1 centM subsetI cW2H -defW2 subsetIr.
-have nsZL: Z <| L.
- have [inA | /caseB_cZL/sub_center_normal//] := boolP caseA.
- by rewrite /Z inA (char_normal_trans _ nsHL) // charI ?gFchar.
+ 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[]//].
+ rewrite /Z; case: ifPn => [_ | /caseB_P[] //].
by rewrite /= setIC meet_center_nil // (sameP eqP derG1P).
-have nsZH := sub_center_normal sZZ; have [sZH nZH] := andP nsZH.
+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 [inA | /caseB_cZL cZL] := boolP caseA; last first.
+ 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)/setIP[_]; rewrite -sub_cent1 => /setIidPl.
+ 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 sZZ x Zx.
+ 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-> // | in_c2] := boolP case_c1; first exact/setD1P.
- have [_ [_ [_ _ _ regW1] _] _ _] := c2W2 in_c2.
- apply: contraNeq ntx => /trivgPn[y /setIP[W1y cxy] nty].
- rewrite -in_set1 -set1gE -((_ =P [1]) inA) -(regW1 y) 2!inE ?nty //.
- by rewrite inE cent1C cHx Hx.
-have Zconst_modH :=
- constant_irr_mod_TI_Sylow sylH oddL tiA (And3 nsZL ntZ sZZ) regZL.
-pose X := seqIndD H L Z 1; pose Y := seqIndD H L H H^`(1).
+ 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 sub1G (subset_trans sZH').
+ 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.
- have kH'iInd: H^`(1)%g \subset cfker ('Ind[L] 'chi_i).
- by rewrite sub_cfker_Ind_irr ?normal_norm.
- rewrite -(cfQuoK nsH'L kH'iInd) -cfIndQuo // -quo_IirrE //.
- set i1 := quo_Iirr _ i; have /irrP[k ->]: 'Ind 'chi_i1 \in irr (L / H^`(1)).
- apply: irr_induced_Frobenius_ker; first exact: FrobeniusWker frobL1.
- apply: contraNneq not_kHi; rewrite -(quo_IirrK nsH'H kH'i) -/i1 => ->.
- by rewrite mod_IirrE // irr0 cfMod_cfun1 ?cfker_cfun1.
- by rewrite -mod_IirrE ?mem_irr.
+ 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.
- rewrite cfInd1 // -divgS // -(sdprod_card defL) mulKn //.
- by case/andP: kH'i => _ /eqP->; rewrite mulr1.
+ 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 [eta1 Yeta1]: exists eta1, eta1 \in Y.
- pose IY := Iirr_kerD H H H^`(1)%G.
- have [IY0 | [j IYj]] := set_0Vmem IY; last first.
- by exists ('Ind 'chi_j); apply/seqIndP; exists j.
- have /idPn[]: \sum_(j in IY) ('chi_j 1%g) ^+ 2 == 0 by rewrite IY0 big_set0.
- rewrite sum_Iirr_kerD_square ?der_sub // indexgg mul1r subr_eq0.
- by rewrite pnatr_eq1 indexg_eq1 proper_subn.
-have caseA_coh12: caseA -> coherent (X ++ Y) L^# tau.
- move=> haveA.
+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_irr irrS | in_c2] := boolP case_c1.
- move=> phi Xphi; apply: irrS; apply: seqIndS phi Xphi.
- by rewrite Iirr_kerDS // (subset_trans sZH') ?der_sub.
- move/(_ in_c2) in prW2; have [_ ptiL _ _] := c2W2 in_c2.
- have [[_ _ _ cycW1] [ntW2 sW2H cycW2 prW1H] oddW] := ptiL.
- have nZL := normal_norm nsZL; have nZW1 := subset_trans sW1L nZL.
- have isoW2: (W2 / Z)%g \isog W2.
+ 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.
- by rewrite -(setIidPr sZZ) setIAC ((_ =P [1]) haveA) setI1g.
- have [|defWb ptiLZ] := primeTIhyp_quotient ptiL _ sZH nsZL.
- by rewrite (isog_eq1 isoW2).
- pose Ichi := primeTI_Ires ptiL; pose IchiZ := primeTI_Ires ptiLZ.
- have eq_Ichi: codom (fun j1 => mod_Iirr (IchiZ j1)) =i codom Ichi.
- apply/subset_cardP.
- rewrite !card_codom; last first; try exact: prTIres_inj.
- apply: inj_comp (prTIres_inj ptiLZ).
- exact: can_inj (mod_IirrK (sub_center_normal sZZ)).
- by rewrite !card_ord !NirrE (nclasses_isog isoW2).
- apply/subsetP=> _ /codomP[/= j1 ->].
- have [[j2 /irr_inj->] | ] := prTIres_irr_cases ptiL (mod_Iirr (IchiZ j1)).
- exact: codom_f.
- case=> /idPn[]; rewrite mod_IirrE // cfIndMod // cfInd_prTIres.
- apply: contra (prTIred_not_irr ptiLZ j1) => /irrP[ell Dell].
- by rewrite -[_ j1]cfModK // Dell -quo_IirrE ?mem_irr // -Dell cfker_mod.
- move=> _ /seqIndP[k /setDP[_ kZ'k] ->].
- have [[j /irr_inj Dk] | [] //] := prTIres_irr_cases ptiL k.
- case/negP: kZ'k; have: k \in codom Ichi by rewrite Dk codom_f.
- by rewrite -eq_Ichi => /codomP[j1 ->]; rewrite !inE mod_IirrE ?cfker_mod.
- have [//|] := seqIndD_irr_coherence nsHL solH scohS odd_frobL1 _ irrX.
- rewrite -/X => defX [tau2 cohX]; have [[Itau2 Ztau2] Dtau2] := cohX.
- have [xi1 Xxi1 Nd]:
- exists2 xi1, xi1 \in X & forall xi, xi \in X -> (xi1 1%g %| xi 1%g)%C.
- - pose IX := Iirr_kerD H Z 1%G; have [i0 IXi0]: exists i0, i0 \in IX.
- apply/set0Pn; apply: contraNneq ntZ => IX_0.
- have: \sum_(i in IX) ('chi_i 1%g) ^+ 2 == 0 by rewrite IX_0 big_set0.
- rewrite sum_Iirr_kerD_square ?normal1 ?sub1G // indexg1 mulf_eq0.
- by rewrite (negPf (neq0CiG H Z)) subr_eq0 trivg_card1 -eqC_nat.
- have:= erefl [arg min_(i < i0 in IX) truncC ('chi_i 1%g)].
- have [//|{i0 IXi0} i1 IXi1 min_i1 _] := arg_minP.
- exists ('Ind 'chi_i1); first by apply/seqIndP; exists i1.
- move=> _ /seqIndP[i /min_i1 le_i1_i] ->; rewrite !cfInd1 //.
- have pHP := p_natP (pnat_dvd _ pH).
- move: (dvd_irr1_cardG i1) (dvd_irr1_cardG i) le_i1_i.
- rewrite !irr1_degree -!natrM !dvdC_nat => /pHP[m1 ->] /pHP[m ->].
- rewrite !natCK leq_exp2l ?prime_gt1 // => /subnKC <-.
- by rewrite expnD mulnA dvdn_mulr.
+ 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{Nd} def_d xi: xi \in X -> xi 1%g = d xi * xi1 1%g.
- rewrite /d => Xxi; move: Xxi (Nd _ Xxi) => /irrX/irrP[i ->].
- have /irrX/irrP[i1 ->] := Xxi1.
- rewrite !irr1_degree dvdC_nat => /dvdnP[q ->].
- by rewrite natrM -irr1_degree mulfK ?irr1_neq0 // natCK.
- have d_xi1: d xi1 = 1.
- by apply: (mulIf (seqInd1_neq0 nsHL Xxi1)); rewrite mul1r -def_d.
- 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 [_ [Itau Ztau] /orthogonal_free freeS _ _] := scohS.
+ 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 Dxi11]: exists2 a, a \in Cnat & xi1 1%g = a * #|W1|%:R.
- have [i1 _ ->] := seqIndP Xxi1.
- exists ('chi_i1 1%g); first exact: Cnat_irr1.
- by rewrite cfInd1 // -divgS // -(sdprod_card defL) ?mulKn // mulrC.
- pose psi1 := xi1 - a *: eta1; have Za: a \in Cint by rewrite CintE Na.
+ 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) -Dxi11 subrr eqxx.
- by rewrite rpredB ?scale_zchar ?mem_zchar ?(sXS _ Xxi1) // sYS.
+ 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 oY: orthonormal Y by apply: sub_orthonormal (irr_orthonormal L).
- have oYtau: orthonormal (map tau1 Y) by apply: map_orthonormal.
- have{dX1 Y1 dY1} [b Zb Dpsi1]: {b | b \in Cint &
+ 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).
- rewrite rpredD // Cint_cfdot_vchar ?Ztau1 ?seqInd_zcharW //.
- exact: zcharW (Ztau _ Zpsi1).
- rewrite {1}dX1 addrC -addrA; congr (_ + _).
- have [_ -> ->] := orthonormal_span oYtau dY1.
- rewrite -[Y1](addrK X1) -dX1 big_map !(big_rem eta1 Yeta1) /=.
- rewrite cfdotBl (orthoPl oX1tauY) ?map_f // subr0.
- rewrite scalerDr addrA; congr (_ + _).
- by rewrite addrC -scaleNr -scalerDl addrK.
- rewrite raddf_sum; apply: eq_big_seq => eta.
- rewrite mem_rem_uniq ?seqInd_uniq // => /andP[eta1'eta /= Yeta].
- congr (_ *: _); rewrite cfdotBl (orthoPl oX1tauY) ?map_f // subr0 addrC.
- apply: canRL (subrK _) _; rewrite -2!raddfB /=.
- have Zeta: (eta - eta1) \in 'Z[Y, L^#].
+ 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) //.
- rewrite cfdotBl cfdotZl !cfdotBr 2?(orthogonalP oXY) // subr0 add0r.
- have [_ oYY] := orthonormalP oY; rewrite !oYY // eqxx.
- by rewrite eq_sym (negPf eta1'eta) add0r mulrN mulr1 opprK.
- pose psi := 'Res[L] (tau1 eta1).
- have [X2 dX2 [xi' [dxi' _ oxi'X]]] := orthogonal_split X psi.
+ 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 Zpsi: psi \in 'Z[irr L] by rewrite cfRes_vchar ?Ztau1 ?seqInd_zcharW.
- pose sumXd := \sum_(xi <- X) d xi *: xi.
+ 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 ?scale_zchar ?seqInd_zcharW ?rpred_nat.
- have{dxi' X2 dX2} [c Zc Dpsi]: {c | c \in Cint & psi = c *: sumXd + xi'}.
- exists '[psi, xi1]; first by rewrite Cint_cfdot_vchar ?(seqInd_vcharW Xxi1).
- rewrite {1}dxi'; congr (_ + _); have [_ -> ->] := orthonormal_span oX dX2.
- rewrite -[X2](addrK xi') -dxi' raddf_sum; apply: eq_big_seq => /= xi Xxi.
- rewrite cfdotBl (orthoPl oxi'X) // subr0 scalerA; congr (_ *: _).
- apply/eqP; rewrite -subr_eq0 mulrC -[d xi]conj_Cnat ?Cnat_nat //.
- rewrite -cfdotZr -cfdotBr cfdot_Res_l -Dtau2 ?Zxi1Xd //.
- rewrite cfdotC raddfB raddfZ_Cnat ?Cnat_nat // cfdotBl cfdotZl.
- by rewrite !(orthogonalP o_tauXY) ?map_f // mulr0 subr0 conjC0.
- have Exi' z: z \in Z -> xi' z = xi' 1%g.
- move=> Zz; rewrite [xi']cfun_sum_cfdot !sum_cfunE; apply: eq_bigr => ell _.
- have [Xell |] := boolP ('chi_ell \in X).
- by rewrite !cfunE (orthoPl oxi'X) ?mul0r.
- by rewrite !cfunE defX inE /= mem_irr negbK => /subsetP/(_ z Zz)/cfker1->.
+ 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 cfdot_Res_l -/tau Dpsi1 -addrA !cfdotDr cfdotNr cfdotZr.
- rewrite cfdotC (orthoPl oX1tauY) ?map_f // conjC0 add0r addrC.
- rewrite cfdotC raddf_sum cfproj_sum_orthonormal // !aut_Cint //.
- by have [_ ->] := orthonormalP oYtau; rewrite ?map_f // eqxx mulr1.
- have nz_xi11: xi1 1%g != 0 by have /irrX/irrP[i ->] := Xxi1; apply: irr1_neq0.
- have {Eba} Ebc: (a %| b - c)%C.
+ 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 oxi'X) // addr0 d_xi1 mulr1.
- rewrite addrC -addrA addKr addrC rpredB ?dvdC_refl //= cfdotZr aut_Cint //.
+ 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)%g %% Z)%CF).
- apply: canRL (scalerK nz_xi11) _; rewrite !cfReg_sum 2!linear_sum /=.
- pose F (xi : 'CF(L)) := xi 1%g *: xi; transitivity (\sum_(xi <- X) F xi).
- by apply: eq_big_seq => xi Xxi; rewrite scalerA mulrC -def_d.
- rewrite (bigID (mem (Iirr_ker L Z))) /=; apply: canRL (addrK _) _.
- rewrite addrC; congr (_ + _).
- rewrite (eq_bigl _ _ (in_set _)) (reindex _ (mod_Iirr_bij nsZL)) /=.
+ 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 <- [seq 'chi_i | i in [predC Iirr_ker L Z]]) F xi).
- apply: eq_big_perm; apply: uniq_perm_eq => // [|xi].
- by rewrite (map_inj_uniq irr_inj) ?enum_uniq.
- rewrite defX inE /=; apply/andP/imageP=> [[/irrP[i ->] kerZ'i] | [i]].
- by exists i; rewrite ?inE.
- by rewrite !inE => ? ->; rewrite mem_irr.
- by rewrite big_map big_filter; apply: eq_bigl => i; rewrite !inE.
- have eta1tauZ z: z \in Z^# -> tau1 eta1 z - tau1 eta1 1%g = - c * #|H|%:R / a.
- case/setD1P=> ntz Zz; transitivity (psi z - psi 1%g).
- by rewrite !cfResE ?(subsetP (normal_sub nsZL)).
- rewrite Dpsi DsumXd !cfunE Exi' ?cfuniE ?normal1 // set11 inE (negPf ntz).
- rewrite mulr0 mulr1 sub0r Dxi11 cfker1 ?cfker_reg_quo //.
- set cc := c * _ + _; rewrite 2!mulrDr -[rhs in _ - rhs]addrA -/cc.
- rewrite addrC opprD {cc}subrK -(sdprod_card defL) mulnC natrM.
- by rewrite invfM !mulrA divfK ?neq0CG // mulrAC -2!mulNr.
- have{eta1tauZ} dvHpsi: (#|H| %| - c * #|H|%:R / a)%C.
- have /dirrP[e [i Deta1]]: tau1 eta1 \in dirr G.
- rewrite dirrE Ztau1 ?Itau1 ?seqInd_zcharW //=.
- by have [_ ->] := orthonormalP oY; rewrite ?eqxx.
- have [z ntz Zz] := trivgPn _ ntZ; have Z1z: z \in Z^# by apply/setD1P.
- have /(Zconst_modH i)[|_] := Z1z.
- move=> z1 z2 Zz1 Zz2; rewrite -(canLR (signrZK e) Deta1) !cfunE.
- by apply/eqP; do 2!rewrite eq_sym (canRL (subrK _) (eta1tauZ _ _)) //.
- by rewrite -(canLR (signrZK e) Deta1) !cfunE -mulrBr eta1tauZ // rpredMsign.
- have nz_a: a != 0 by rewrite Dxi11 mulf_eq0 negb_or neq0CG andbT in nz_xi11.
- have{dvHpsi} dv_ac: (a %| c)%C.
- move: dvHpsi; rewrite !mulNr mulrAC rpredN => /dvdCP[q Zq].
- by move/(mulIf (neq0CG H))/(canRL (divfK nz_a))->; apply: dvdC_mull.
- have{Ebc dv_ac} /dvdCP[q Zq Db]: (a %| b)%C by rewrite -[b](subrK c) rpredD.
- pose m : algC := (size Y)%:R.
- have Da1: 1 + a ^+ 2 = '[X1] + a ^+ 2 * ((q - 1) ^+ 2 + (m - 1) * q ^+ 2).
- transitivity '[psi1].
- rewrite cfnormBd; last by rewrite cfdotZr (orthogonalP oXY) ?mulr0.
- rewrite cfnormZ Cint_normK //.
- have [[_ -> //] [_ -> //]]:= (orthonormalP oX, orthonormalP oY).
- by rewrite !eqxx mulr1.
- rewrite -Itau // Dpsi1 -addrA cfnormDd; last first.
- rewrite addrC cfdotBr !cfdotZr cfdot_sumr (orthoPl oX1tauY) ?map_f //.
- rewrite big_seq big1 ?mulr0 ?subrr // => eta Yeta.
- by rewrite (orthoPl oX1tauY) ?map_f //.
- congr (_ + _); rewrite cfnormD cfnormN !cfnormZ.
- have [_ ->] := orthonormalP oYtau; rewrite ?map_f // eqxx mulr1.
- rewrite cfnorm_map_orthonormal // -/m !Cint_normK // cfdotNl cfdotZl.
- rewrite linear_sum cfdotC cfproj_sum_orthonormal // rmorphN rmorphM.
- rewrite conjCK !aut_Cint // -mulr2n mulNrn -[_ - _]addrAC.
- rewrite mulrDr -{1}[m](addNKr 1) mulrDr mulr1 addrA -sqrrB.
- congr (_ + _); last by rewrite mulrCA -exprMn (mulrC a) addrC -Db mulrC.
- by rewrite -exprMn -sqrrN opprB mulrBr mulr1 (mulrC a) -Db.
- have{Da1} maxq: ~~ (2%:R <= (q - 1) ^+ 2 + (m - 1) * q ^+ 2).
- have a2_gt1: a ^+ 2 > 1.
- have /seqIndP[i1 /setDP[_ not_kerH'i1] Dxi1] := Xxi1.
- apply: contraR not_kerH'i1; rewrite inE expr_gt1 ?Cnat_ge0 //.
- have [n Da] := CnatP a Na; rewrite Da ltr1n -leqNgt leq_eqVlt.
- rewrite ltnNge lt0n -!eqC_nat -{n}Da nz_a orbF => /eqP a_eq1.
- rewrite (subset_trans sZH') // -lin_irr_der1 qualifE irr_char.
- rewrite -(inj_eq (mulfI (neq0CiG L H))) -cfInd1 // -Dxi1 Dxi11 a_eq1.
- by rewrite mul1r mulr1 -divgS //= -(sdprod_card defL) mulKn.
- rewrite -(ler_pmul2l (ltr_trans ltr01 a2_gt1)) ltr_geF // mulr_natr.
- apply: ler_lt_trans (_ : 1 + a ^+ 2 < _); last by rewrite ltr_add2r.
- by rewrite Da1 -subr_ge0 addrK cfnorm_ge0.
- clear psi Dpsi Zpsi Zb c sumXd DsumXd Zc xi' Exi' oxi'X.
- wlog{Dpsi1 Itau1 Ztau1 Dtau1 oYtau b q maxq Db Zq} Dpsi1:
+ 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 | nz_q] := eqVneq q 0.
- by apply: (IH tau1) => //; rewrite Dpsi1 Db q0 mul0r scale0r addr0.
- have m1_ge1: 1 <= m - 1.
- rewrite -(@ler_add2r _ 1) subrK (ler_nat _ 2).
- exact: seqInd_nontrivial (irrY _ Yeta1) (Yeta1).
- have q1: q = 1.
- apply: contraNeq maxq; rewrite -subr_eq0 => nz_q1.
- rewrite ler_add // ?sqr_Cint_ge1 ?rpredB //.
- rewrite (ler_trans m1_ge1) // -{1}[m - 1]mulr1.
- by rewrite ler_pmul2l ?sqr_Cint_ge1 // (ltr_le_trans ltr01).
- have szY2: (size Y <= 2)%N.
- move: maxq; rewrite q1 subrr exprS mul0r add0r mulrA !mulr1.
- by rewrite -(ler_add2r 1) subrK -mulrSr ler_nat -leqNgt.
+ - 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 /= andbT inE eq_sym; have [[_ /hasPn/=->]] := scohY.
+ 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 map (tau1 \o cfAut conjC) Y <= map tau1 Y}.
+ 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)).
+ 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 Dpsi1 (eq_big_perm _ defY) Db q1 /= mul1r big_cons big_seq1.
+ 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] [_ oXX]] := (cohY, orthonormalP oX).
+ have [[Itau1 Ztau1] Dtau1] := cohY.
have n1X1: '[X1] = 1.
- apply: (addIr '[a *: tau1 eta1]); rewrite -cfnormBd; last first.
- by rewrite cfdotZr (orthoPl oX1tauY) ?mulr0 ?map_f.
- rewrite -Dpsi1 Itau // cfnormBd; last first.
- by rewrite cfdotZr (orthogonalP oXY) ?mulr0.
- by rewrite !cfnormZ Itau1 ?seqInd_zcharW // oXX ?eqxx.
+ 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 -[X1](subrK (a *: tau1 eta1)) -Dpsi1.
- rewrite rpredD ?scale_zchar ?(zcharW (Ztau _ _)) //.
- by rewrite Ztau1 ?seqInd_zcharW.
- have oX1_Xd xi:
- xi \in X -> xi != xi1 -> '[d xi *: tau2 xi1 - tau2 xi, X1] = d xi.
+ 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 -[X1](subrK (a *: tau1 eta1)) -Dpsi1 cfdotDr cfdotZr addrC.
- rewrite cfdotBl cfdotZl 2?(orthogonalP o_tauXY) ?map_f //.
- rewrite !(mulr0, subr0, conjC0) add0r -{1}raddfZ_Cnat ?Cnat_nat //.
- rewrite -opprB cfdotNl -raddfB Dtau2 //.
- rewrite Itau //; last exact: zchar_subset ZXxi.
- rewrite cfdotBr cfdotZr addrC !cfdotBl !cfdotZl.
- rewrite 2?(orthogonalP oXY) // !(mulr0, oppr0, add0r, conjC0).
- by rewrite !oXX // eqxx (negPf xi1'xi) add0r opprK mulr1.
- have Xxi2: xi1^*%CF \in X by apply: ccX.
- have xi1'2: xi1^*%CF != xi1 by have [[_ /hasPn->]] := scohX.
- have xi2tau_irr: - tau2 xi1^*%CF \in dirr G by rewrite dirr_opp dirrXtau.
- have d_xi2: d xi1^*%CF = 1.
- by rewrite /d cfunE conj_Cnat // (Cnat_seqInd1 Xxi1).
- have [||def_X1]:= cfdot_add_dirr_eq1 (dirrXtau _ Xxi1) xi2tau_irr dirrX1.
- - by rewrite -[tau2 xi1]scale1r -d_xi2 oX1_Xd.
- - exact: IH.
- have sX_xi12: {subset X <= xi1 :: xi1^*%CF}.
- apply/allP/allPn=> [[xi3 Xxi3 /norP[xi1'3 /norP[xi2'3 _]]]].
- suffices d3_0: d xi3 = 0.
- by have:= seqInd1_neq0 nsHL Xxi3; rewrite def_d // d3_0 mul0r eqxx.
- rewrite -oX1_Xd // def_X1 cfdotNr cfdotBl cfdotZl !Itau2 ?ZX //.
- by rewrite !oXX // (negPf xi2'3) eq_sym (negPf xi1'2) mulr0 add0r opprK.
- have{sX_xi12 defX} defX: perm_eq X (xi1 :: xi1^*%CF).
- have uXxi: uniq (xi1 :: xi1^*)%CF by rewrite /= andbT inE eq_sym.
- rewrite perm_eq_sym uniq_perm_eq // => xi.
- by apply/idP/idP; [rewrite !inE => /pred2P[]-> | apply: sX_xi12].
- have szX2: (size X <= 2)%N by rewrite (perm_eq_size defX).
- apply: (IH _ (dual_coherence scohX cohX szX2)) def_X1.
- rewrite (map_comp -%R) orthogonal_oppl.
- apply/orthogonalP=> _ eta /mapP[xi Xxi ->].
- by apply: (orthogonalP o_tauXY); rewrite map_f ?ccX.
- move: Dpsi1; rewrite -raddfZ_Cnat // defX1.
- apply: (bridge_coherent scohS ccsXS cohX ccsYS cohY X'Y).
+ 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_coh12} cohXY: coherent (X ++ Y) L^# tau.
- have [/caseA_coh12// | caseB] := boolP caseA.
- have defZ: Z = W2 by rewrite /Z (negPf caseB).
- have{caseB} [case_c2 _ _] := caseB_P caseB.
- move/(_ case_c2) in oRW; pose PtypeL := c2W2 case_c2.
- have{prW2} pr_w2 := prW2 case_c2; set w2 := #|W2| in pr_w2.
+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 idYZ: {in Y & Z^#, forall (eta : 'CF(L)) x, tau1 eta x = tau1 eta z0}.
- move=> eta x Yeta; rewrite !inE andbC cycZ => /andP[/cyclePmin[k]].
- rewrite orderE -cycZ defZ -/w2 => lt_k_w2 -> nt_z0k.
- have k_gt0: (0 < k)%N by rewrite lt0n (contraNneq _ nt_z0k) // => ->.
- have cokw2: coprime k w2 by rewrite coprime_sym prime_coprime // gtnNdvd.
- have sW2G: W2 \subset G by rewrite -defW2 subIset // (subset_trans sHL).
- have [u Du _]:= make_pi_cfAut G cokw2.
- rewrite -Du ?Ztau1 ?seqInd_zcharW //; last by rewrite orderE -cycZ defZ.
- have nAL: L \subset 'N(A) by rewrite normD1 normal_norm.
+ 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 cohY_Dade: coherent_with Y L^# (Dade ddA) tau1.
- split=> // phi Yphi; rewrite Dtau1 ?Dade_Ind //.
- by rewrite (@zchar_on _ _ Y) -?zcharD1_seqInd.
+ 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) raddfD cfunE.
- apply: canLR (subrK _) _; rewrite subrr.
- have [_ ->] := cohY_Dade; last first.
- by rewrite -opprB rpredN zcharD1_seqInd // seqInd_sub_aut_zchar.
- rewrite Dade_id; last first.
- by rewrite !inE -cycle_eq1 -cycle_subG -cycZ ntZ.
+ 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) //.
- rewrite -cycle_subG -cycZ (subset_trans sZH') //.
- have [j /setDP[kerH'j _] ->] := seqIndP Yeta.
- by rewrite inE in kerH'j; rewrite sub_cfker_Ind_irr.
- have [_ [Itau _] oSS _ _] := scohS.
- have oY: orthonormal Y by apply: sub_orthonormal (irr_orthonormal L).
- have oYtau: orthonormal (map tau1 Y) by apply: map_orthonormal.
- 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 [Y1 Dpsi1 defY1]: exists2 Y1,
- forall i : Iirr Z, i != 0 ->
+ 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 ('Ind 'chi_i - #|H : Z|%:R *: eta1) = X1 - #|H : Z|%:R *: Y1
+ & tau (gamma i) = X1 - #|H : Z|%:R *: Y1
& Y1 = tau1 eta1 \/ size Y = 2 /\ Y1 = dual_iso tau1 eta1.
- - have [i0 nz_i0]: exists i0 : Iirr Z, i0 != 0.
- by apply: (ex_intro _ (Sub 1%N _)) => //; rewrite NirrE classes_gt1.
- pose psi1 := tau1 eta1; pose b := psi1 z0.
+ - pose psi1 := tau1 eta1; pose b := psi1 z0.
pose a := (psi1 1%g - b) / #|Z|%:R.
- have sZL := normal_sub nsZL; have sZG := subset_trans sZL sLG.
- have Dpsi1: 'Res psi1 = a *: cfReg Z + b%:A.
- apply/cfun_inP=> z Zz.
- rewrite cfResE // !cfunE cfun1E Zz mulr1 cfuniE ?normal1 // inE.
- have [-> | ntz] := altP eqP; first by rewrite mulr1 divfK ?neq0CG ?subrK.
- by rewrite !mulr0 add0r idYZ // !inE ntz.
+ 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.
- have /dvdCP[x Zx Dx]: (#|H| %| b - psi1 1%g)%C.
- have psi1Z z: z \in Z^# -> psi1 z = b.
- case/setD1P=> ntz Zz; rewrite -(cfResE _ _ Zz) // Dpsi1 !cfunE cfun1E.
- by rewrite cfuniE ?normal1 // Zz inE (negPf ntz) !mulr0 mulr1 add0r.
- 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/(Zconst_modH i)[z1 Zz1 z2 Zz2 |_] := Zz.
- by rewrite -Epsi1 !cfunE !psi1Z.
- by rewrite -Epsi1 !cfunE -mulrBr rpredMsign psi1Z.
- apply/dvdCP; exists (- x); first by rewrite rpredN.
- rewrite /a -opprB Dx -(Lagrange sZH) mulnC [p in x * p]natrM -!mulNr.
- by rewrite !mulrA !mulfK ?neq0CG.
+ 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.
- pose alpha i := 'Ind[L, Z] 'chi_i - #|H : Z|%:R *: eta1.
- have IZfacts i: i != 0 ->
- [/\ 'chi_i 1%g = 1, 'Ind[L, Z] 'chi_i \in 'Z[X] & alpha i \in 'Z[S, L^#]].
- - move=> nzi; have /andP[_ /eqP lin_i]: 'chi_i \is a linear_char.
+ 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; apply: scale_zchar.
+ apply: rpred_sum => k k_i; rewrite linearZ rpredZ_Cint ?mem_zchar //=.
by rewrite Cint_cfdot_vchar_irr // cfInd_vchar ?irr_vchar.
- rewrite seqInd_zcharW //; apply/seqIndP; exists k => //.
- rewrite !inE sub1G andbT; apply: contra k_i => kerZk.
- rewrite -Frobenius_reciprocity.
- have ->: 'Res[Z] 'chi_k = ('chi_k 1%g)%:A.
- apply: cfun_inP => z Zz; rewrite cfunE cfun1E Zz mulr1 cfResE //.
- by rewrite cfker1 ?(subsetP kerZk).
- by rewrite cfdotZr -irr0 cfdot_irr (negPf nzi) mulr0.
+ 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 -divgS // -(sdprod_card defL) -(Lagrange sZH) -mulnA mulKn //.
- rewrite -natrM subrr rpredB //=; first by rewrite (zchar_subset sXS).
- by rewrite scale_zchar ?rpred_nat // seqInd_zcharW ?sYS.
- have Dalpha (i : Iirr Z) (nzi : i != 0) :
+ 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 (alpha i) = X1 - #|H : Z|%:R *: Y1.
- - have [lin_i Xchi Zalpha] := IZfacts i nzi.
- have Da: '[tau (alpha i), psi1] = a - #|H : Z|%:R * x1.
- rewrite !(=^~ Frobenius_reciprocity, cfdotBl) cfResRes // cfdotZl.
- congr (_ - _); rewrite cfdotC Dpsi1 cfdotDl cfdotZl cfReg_sum.
- rewrite cfdot_suml (bigD1 i) //= big1 => [|j i'j]; last first.
- by rewrite cfdotZl cfdot_irr (negPf i'j) mulr0.
- rewrite !cfdotZl cfnorm_irr lin_i addr0 !mulr1.
- rewrite -irr0 cfdot_irr eq_sym (negPf nzi) mulr0 addr0.
+ & 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.
- have [Y2 dY2 [X1 [dX1 _ oX1Yt]]] :=
- orthogonal_split (map tau1 Y) (tau (alpha i)).
- exists X1 => //; rewrite dX1 addrC scalerN opprK scaler_sumr.
- congr (_ + _); have [_ -> ->] := orthonormal_span oYtau dY2.
- rewrite big_map; apply: eq_big_seq => eta Yeta.
- rewrite scalerA -[Y2](addrK X1) -dX1 cfdotBl (orthoPl oX1Yt) ?map_f //.
- congr (_ *: _); rewrite subr0 !mulrBr mulrDr mulrC -Dx0.
- rewrite (addrAC a) -Da -addrA -mulrBr addrC; apply: canRL (subrK _) _.
- have Zeta: eta - eta1 \in 'Z[Y, L^#].
+ 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 -cfdotBr -raddfB Dtau1 // Itau //; last first.
- by rewrite (zchar_subset sYS) ?seqInd_free.
- rewrite cfdotBl (span_orthogonal oXY) ?(zchar_span Xchi)//; last first.
- by rewrite memvB ?memv_span.
- have [_ oYY] := orthonormalP oY; rewrite cfdotZl cfdotBr !oYY //.
- by rewrite eqxx sub0r -mulrN opprB eq_sym.
- exists Y1 => //; have{Dalpha} [X1 oX1Y Dalpha] := Dalpha i0 nz_i0.
- have [lin_i Xchi Zalpha] := IZfacts i0 nz_i0.
- have norm_alpha: '[tau (alpha i0)] = (#|L : Z| + #|H : Z| ^ 2)%:R.
+ 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 (#|_ : _|%:R + _).
- apply/setIidPl; apply: subset_trans (cent_sub_inertia _).
- rewrite -(sdprodW defL) mulG_subG (centsS sZZ) centsC ?subsetIr //=.
- by rewrite defZ -defW2 subsetIr.
- have [_ oYY] := orthonormalP oY; rewrite cfnormZ oYY // eqxx mulr1.
- by rewrite normCK rmorph_nat -natrM.
- have{norm_alpha} ub_norm_alpha: '[tau (alpha i0)] < (#|H : Z| ^ 2).*2%:R.
- rewrite norm_alpha -addnn ltr_nat ltn_add2r.
- rewrite -divgS // -(sdprod_card defL) -(Lagrange sZH) -mulnA mulKn //.
- rewrite ltn_pmul2l //.
+ 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 (normal_norm nsZL).
- rewrite (card_isog (quotient_isog nZW1 _)); last first.
- by rewrite coprime_TIg ?(coprimeSg sZH).
- rewrite -(prednK (indexg_gt0 H Z)) ltnS -card_quotient //.
+ 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.
- pose m : algC := (size Y)%:R.
- have{ub_norm_alpha} ub_xm: ~~ (2%:R <= (x - 1) ^+ 2 + (m - 1) * x ^+ 2).
- have: ~~ (2%:R <= '[Y1]).
- rewrite -2!(ler_pmul2l (gt0CiG H Z)) -!natrM mulnA muln2.
- rewrite ltr_geF //; apply: ler_lt_trans ub_norm_alpha.
- rewrite Dalpha cfnormBd.
+ 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 scalerN -scaleNr cfdotZr cfdot_sumr big_seq.
- rewrite big1 ?mulr0 // => eta Yeta.
- by rewrite cfdotZr (orthoPl oX1Y) ?map_f ?mulr0.
+ 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.
- rewrite big_seq (eq_bigr (fun _ => (x ^+ 2))) => [|eta]; last first.
- rewrite mem_rem_uniq // => /andP[/negPf-> _].
+ 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 Cint_normK 1?rpredB //= -big_seq; congr (~~ (_ <= _ + _)).
- rewrite big_const_seq count_predT // -Monoid.iteropE.
- rewrite /m (perm_eq_size (perm_to_rem Yeta1)) /=.
- by rewrite mulrSr addrK mulr_natl.
- have [x_eq0 | nz_x] := eqVneq x 0.
+ 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 => [|eta]; last first.
- by rewrite mem_rem_uniq // => /andP[/negPf-> _]; rewrite subrr scale0r.
- by rewrite addr0 opprK.
- have m1_ge1: 1 <= m - 1.
- rewrite -(@ler_add2r _ 1) subrK (ler_nat _ 2).
- exact: seqInd_nontrivial (irrY _ Yeta1) (Yeta1).
- right; have x_eq1: x = 1.
- apply: contraNeq ub_xm; rewrite -subr_eq0 => nz_x1; apply: ler_add.
- by rewrite sqr_Cint_ge1 // rpredB.
- rewrite (ler_trans m1_ge1) // -{1}[m - 1]mulr1 ler_pmul2l.
- exact: sqr_Cint_ge1.
- exact: ltr_le_trans ltr01 m1_ge1.
- have szY2: size Y = 2.
- apply: contraNeq ub_xm => Yneq2; rewrite x_eq1 /m subrr !exprS mul0r.
- rewrite add0r !mul1r mulr1 -(ler_add2r 1) subrK -mulrSr ler_nat.
- by rewrite ltn_neqAle eq_sym Yneq2 -leC_nat -/m -[m](subrK 1) ler_add2r.
+ 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.
@@ -1229,74 +1080,67 @@ have{caseA_coh12} cohXY: coherent (X ++ Y) L^# tau.
have sY2Y: {subset (eta1 :: eta1^*%CF) <= Y}.
by apply/allP; rewrite /= cfAut_seqInd ?Yeta1.
by have [|//]:= leq_size_perm uY2 sY2Y; rewrite szY2.
- split=> //; congr (- _); rewrite (eq_big_perm _ defY) /= x_eq1.
- rewrite big_cons big_seq1 eqxx (negPf eta1'2) subrr scale0r add0r.
- by rewrite subr0 scale1r.
- have [a Za Dxa]: exists2 a, forall xi, a xi \in Cint
- & forall xi, xi \in X -> xi 1%g = a xi * #|W1|%:R
+ 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 xi *: eta1) = X1 - a xi *: Y1).
- - pose aX (xi : 'CF(L)) : algC := (truncC (xi 1%g / #|W1|%:R))%:R.
- exists aX => [xi | xi Xxi]; first exact: rpred_nat.
- have [k kerZ'k def_xi] := seqIndP Xxi; rewrite !inE sub1G andbT in kerZ'k.
- set a := aX xi; have Dxi1: xi 1%g = a * #|W1|%:R.
- rewrite /a /aX def_xi cfInd1 // -divgS // -(sdprod_card defL) mulKn //.
- by rewrite mulrC mulfK ?neq0CG // irr1_degree natCK.
- split=> //; have Da: a = 'chi_k 1%g.
- apply: (mulIf (neq0CG W1)); rewrite -Dxi1 def_xi cfInd1 //.
- by rewrite mulrC -divgS // -(sdprod_card defL) mulKn.
- have [i0 nzi0 Res_k]: exists2 i: Iirr Z, i != 0 & 'Res 'chi_k = a *: 'chi_i.
- have [chi /andP[Nchi lin_chi] defRkZ] := cfcenter_Res 'chi_k.
+ & 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 sZZ) // -cap_cfcenter_irr bigcap_inf.
- have{Nchi lin_chi} /irrP[i defRk] : 'Res chi \in irr Z.
- by rewrite lin_char_irr // qualifE cfRes_char // cfRes1.
- have{chi defRk defRkZ} defRk: 'Res 'chi_k = a *: 'chi_i.
- by rewrite -defRk -linearZ -/a Da -defRkZ /= cfResRes ?cfcenter_sub.
- exists i => //; apply: contra kerZ'k.
- rewrite -subGcfker => /subsetP sZker.
- apply/subsetP=> t Zt; rewrite cfkerEirr inE.
- by rewrite -!(cfResE _ sZH) // defRk !cfunE cfker1 ?sZker.
+ 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 rmorph_nat.
- have rp_k: k \in rp by rewrite inE ['[_, _]]a_k Da irr1_neq0.
+ 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.
- move=> r_i; rewrite ['Res _]cfun_sum_cfdot.
- rewrite (bigD1 i0) // big1 => /= [|j i0'j].
- rewrite cfdot_Res_l addr0 -/phi cfdotC conj_Cnat //.
- by rewrite Cnat_cfdot_char_irr ?cfInd_char ?irr_char.
- apply/eqP; rewrite scaler_eq0 cfdot_Res_l.
- rewrite -(inj_eq (mulfI r_i)) mulr0 -/(a_ i) -cfdotZl.
- have: '['Ind[H] phi, 'Ind[H] 'chi_j] = 0.
- apply: not_cfclass_Ind_ortho => //.
- have defIj: 'I_H['chi_j] = H.
- apply/setIidPl; apply: subset_trans (cent_sub_inertia _).
- by rewrite centsC (subset_trans sZZ) ?subsetIr.
- rewrite -(congr1 (cfclass _) defIj) cfclass_inertia inE.
- by rewrite eq_sym (inj_eq irr_inj).
- rewrite defIphi cfdot_suml => /psumr_eq0P-> //; first by rewrite eqxx.
- move=> i1 _; rewrite cfdotZl.
- by rewrite mulr_ge0 ?Cnat_ge0 ?Cnat_cfdot_char ?cfInd_char ?irr_char.
+ 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 Da.
+ 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, H] 'chi_i; pose alpha i := chi i - a_ i *: eta1.
+ 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).
- rewrite -divgS // -(sdprod_card defL) mulKn // Da_ // mulrC subrr eqxx.
+ 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]:
- 'Ind phi - #|H : Z|%:R *: eta1 = \sum_(i in rp) a_ i *: alpha i
- /\ \sum_(i in rp) a_ i ^+ 2 = #|H : Z|%:R.
- + set rhs2 := _%:R; set lhs1 := _ - _; set rhs1 := \sum_(i | _) _.
- set lhs2 := \sum_(i | _) _.
+ 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.
@@ -1308,340 +1152,191 @@ have{caseA_coh12} cohXY: coherent (X ++ Y) L^# tau.
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.
+ 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.
- suffices ->: 'Res[Z] 'chi_i = ('chi_i 1%g)%:A.
- by rewrite cfdotZr -irr0 cfdot_irr (negPf nzi0) mulr0.
- apply/cfun_inP=> t Zt; rewrite cfResE // cfunE cfun1E Zt mulr1.
- by rewrite cfker1 ?(subsetP kerZi).
+ 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 n1Y1: '[Y1] = 1.
- have [_ oYYt] := orthonormalP oYtau.
- have [-> | [_ ->]] := defY1;
- by rewrite ?cfnormN oYYt ?eqxx ?map_f // cfAut_seqInd.
- have YtauY1: Y1 \in 'Z[map tau1 Y].
- have [-> | [_ ->]] := defY1;
- by rewrite ?rpredN mem_zchar ?map_f ?cfAut_seqInd.
- have /fin_all_exists[XbZ defXbZ] i: exists XbZ, let: (X1, b, Z1) := XbZ in
- [/\ tau (alpha i) = X1 - b *: Y1 + Z1,
- i \in rp -> X1 \in 'Z[R (chi i)], i \in rp -> b \is Creal,
- '[Z1, Y1] = 0 & i \in rp -> orthogonal Z1 (R (chi i))].
- - have [X1 dX1 [YZ1 [dXYZ _ oYZ1R]]] :=
+ 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)).
- have [Y1b dY1b [Z1 [dYZ1 _ oZY1]]] := orthogonal_split Y1 YZ1.
- have{dY1b} [|b Db dY1b] := orthogonal_span _ dY1b.
- by rewrite /pairwise_orthogonal /= inE eq_sym -cfnorm_eq0 n1Y1 oner_eq0.
- exists (X1, - b Y1, Z1); split.
- + by rewrite dXYZ dYZ1 dY1b scaleNr big_seq1 opprK addrA.
- + have [_ _ _ Rok _] := scohS => /Xchi/sXS/Rok[ZR oRR _].
+ exists X1.
+ have [_ _ _ Rok _] := scohS => /Xchi/sXS/Rok[ZR oRR _].
have [_ -> ->] := orthonormal_span oRR dX1.
rewrite big_seq rpred_sum // => aa Raa.
- rewrite scale_zchar ?mem_zchar //.
- rewrite -[X1](addrK YZ1) -dXYZ cfdotBl (orthoPl oYZ1R) // subr0.
- rewrite Cint_cfdot_vchar ?(ZR aa) //.
- rewrite !(rpredB, cfInd_vchar) ?irr_vchar //.
- rewrite scale_zchar ?(seqInd_vcharW Yeta1) // Cint_cfdot_vchar_irr //.
- by rewrite cfInd_vchar ?irr_vchar.
- + move=> rp_i; rewrite Db -[Y1b](addrK Z1) -dYZ1 cfdotBl (orthoP oZY1).
- rewrite subr0 n1Y1 divr1 -[YZ1](addKr X1) -dXYZ cfdotDl cfdotNl.
- rewrite (span_orthogonal (oRY i rp_i)) ?(zchar_span YtauY1) //.
- rewrite oppr0 add0r Creal_Cint // rpredN Cint_cfdot_vchar //.
- rewrite !(cfInd_vchar, rpredB) ?irr_vchar //.
- rewrite -Da_ // scale_zchar ?Cint_Cnat ?Cnat_irr1 //.
- exact: (seqInd_vcharW Yeta1).
- apply: zchar_trans_on YtauY1 => _ /mapP[eta Yeta ->].
- by rewrite Ztau1 ?seqInd_zcharW.
- + exact: (orthoP oZY1).
- move/oRY=> oRiY; apply/orthoPl=> aa Raa.
- rewrite -[Z1](addKr Y1b) -dYZ1 cfdotDl cfdotNl cfdotC (orthoPl oYZ1R) //.
- rewrite dY1b addr0 big_seq1 cfdotZr.
- by have [-> | [_ ->]] := defY1;
- rewrite ?cfdotNr (orthogonalP oRiY) ?map_f ?cfAut_seqInd //;
- rewrite ?(oppr0, mulr0, rmorph0).
- pose X1 i := (XbZ i).1.1; pose b i := (XbZ i).1.2; pose Z1 i := (XbZ i).2.
- have R_X1 i: i \in rp -> X1 i \in 'Z[R (chi i)].
- by rewrite /X1; case: (XbZ i) (defXbZ i) => [[? ?] ?] [].
- have Rb i: i \in rp -> b i \is Creal.
- by rewrite /b; case: (XbZ i) (defXbZ i) => [[? ?] ?] [].
- have oZY1 i: '[Z1 i, Y1] = 0.
- by rewrite /Z1; case: (XbZ i) (defXbZ i) => [[? ?] ?] [].
- have oZ1R i: i \in rp -> orthogonal (Z1 i) (R (chi i)).
- by rewrite /Z1; case: (XbZ i) (defXbZ i) => [[? ?] ?] [].
- have{defXbZ} defXbZ i: tau (alpha i) = X1 i - b i *: Y1 + Z1 i.
- by rewrite /X1 /b /Z1; case: (XbZ i) (defXbZ i) => [[? ?] ?] [].
+ 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 // scale_zchar ?(seqInd_vcharW Yeta1) //; last first.
- by rewrite Cint_cfdot_vchar_irr // cfInd_vchar ?irr_vchar.
- split=> //; apply/orthoPr=> xi2; rewrite !inE => Dxi2.
- rewrite cfdotZr (orthogonalP oXY) ?mulr0 //.
- by case/pred2P: Dxi2 => ->; rewrite ?cfAut_seqInd ?Xchi.
- + have [_ IZtau _ _ _] := scohS.
+ + 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 ?scale_zchar ?seqInd_zcharW ?(sYS eta1) ?sXS ?Xchi //.
- by rewrite sub_aut_zchar ?zchar_onG ?seqInd_zcharW ?cfAut_seqInd;
- rewrite ?sXS ?Xchi //; apply: seqInd_vcharW.
- by rewrite -Da_ // irr1_degree rpred_nat.
+ 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.
- rewrite (span_orthogonal oYZ_R) ?memv_span1 ?conjC0 //.
- exact: (zchar_span (R_X1 i rp_i)).
- apply/orthoPl=> aa Raa.
- rewrite cfdotBl cfdotZl (orthoPl (oZ1R i _)) //.
- by rewrite subr0 cfdotC; have [-> | [_ ->]] := defY1;
- rewrite ?cfdotNr (orthogonalP (oRY i _)) ?map_f ?cfAut_seqInd //;
- by rewrite ?(mulr0, oppr0, rmorph0).
+ 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.
- have /orP [b_le0|b_ge0] := Rb i rp_i; last first.
- by rewrite (ler_trans b_ge0) ?ltrW.
- rewrite -(@ler_pexpn2r _ 2) //; last exact: ltrW.
+ 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.
- rewrite cfnormZ (normr_idP _) // n1Y1 mulr1 addrC -subr_ge0 addrK.
- exact: cfnorm_ge0.
+ by rewrite cfnormZ normY1 mulr1 ler_addl cfnorm_ge0.
rewrite -(ler_add2l '[X1 i]) -cfnormBd; last first.
- rewrite cfdotBr cfdotZr (span_orthogonal (oRY i _)) //; last first.
- - exact: (zchar_span YtauY1).
- - exact: (zchar_span (R_X1 i rp_i)).
- rewrite mulr0 sub0r cfdotC (span_orthogonal (oZ1R i _)) ?raddf0 //.
- exact: memv_span1.
- exact: (zchar_span (R_X1 i rp_i)).
+ 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 zchar_split (cfun_onS (setSD _ sHL)) ?Aalpha //.
- rewrite rpredB ?scale_zchar ?seqInd_zcharW
- ?(sYS _ Yeta1) ?sXS ?Xchi //.
- by rewrite -Da_ // irr1_degree rpred_nat.
- rewrite opprD opprK addrA -defXbZ // Itau ?Salpha //.
- rewrite cfnormBd; last first.
- by rewrite cfdotZr (orthogonalP oXY) ?mulr0 ?Xchi.
- rewrite cfnormZ (normr_idP _) ?(ltrW ai_gt0) //.
- have [_ /(_ eta1)->//] := orthonormalP oY; rewrite eqxx mulr1 ler_add2r.
- by have [] := ub_alpha i rp_i.
+ 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))] := Dpsi1 i0 nzi0.
+ 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 n1Y1 mulr1 => /(canLR (@opprK _)) <-.
+ 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 n1Y1 mulr1.
- rewrite (span_orthogonal (oRY i _)) ?(zchar_span YtauY1) //.
- by rewrite add0r mulrN subrr.
- exact: (zchar_span (R_X1 i rp_i)).
- exists (X1 k).
+ 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.
- have n1eta1: '[eta1] = 1 by have [_ -> //] := orthonormalP oY; rewrite eqxx.
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 // n1Y1 n1eta1 -subr_ge0 addrK cfnorm_ge0.
+ 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 // n1Y1 n1eta1.
- have oX: pairwise_orthogonal X by rewrite (sub_pairwise_orthogonal sXS).
- have [_ oYY] := orthonormalP oY.
- have [[N_S _ _] [_ /(_ _ _)/zcharW/=Ztau] _ _ _] := scohS.
- have n1eta: '[eta1] = 1 by rewrite oYY ?eqxx.
- have n1Y1: '[Y1] = 1.
- have [_ oYYt] := orthonormalP oYtau.
- have [-> | [_ ->]] := defY1;
- by rewrite ?cfnormN oYYt ?eqxx ?map_f // cfAut_seqInd.
- have YtauY1: Y1 \in <<map tau1 Y>>%VS.
- by have [-> | [_ ->]] := defY1;
- rewrite ?memvN memv_span ?map_f ?cfAut_seqInd.
+ 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.
- have Zalpha xi: xi \in X -> xi - a xi *: eta1 \in 'Z[S, L^#].
- move=> Xxi; rewrite zcharD1E rpredB ?scale_zchar;
- rewrite ?seqInd_zcharW ?(sXS xi) ?sYS //.
- by rewrite !cfunE (uniY eta1) //= subr_eq0; have [<-] := Dxa xi Xxi.
- have Zbeta eta: eta \in Y -> eta - eta1 \in 'Z[S, L^#].
- move=> Yeta; rewrite zcharD1E rpredB ?seqInd_zcharW ?sYS //=.
- by rewrite !cfunE !uniY ?subrr.
- have nza xi: xi \in X -> a xi != 0.
- move=> Xxi; have [/eqP Dxi1 _] := Dxa _ Xxi; apply: contraTneq Dxi1 => ->.
- by rewrite mul0r (seqInd1_neq0 _ Xxi).
- have alphaY xi: xi \in X -> '[tau (xi - a xi *: eta1), Y1] = - a xi.
- case/Dxa=> _ [X1 oX1Y ->]; rewrite cfdotBl cfdotZl n1Y1 mulr1.
- by rewrite (span_orthogonal oX1Y) ?memv_span1 ?add0r.
- have betaY eta: eta \in Y -> '[tau (eta - eta1), Y1] = (eta == eta1)%:R - 1.
- move=> Yeta; rewrite -Dtau1; last first.
- by rewrite zchar_split (zchar_on (Zbeta eta _)) ?rpredB ?seqInd_zcharW.
- rewrite raddfB cfdotBl.
- have [-> | [szY2 ->]] := defY1.
- by rewrite !{1}Itau1 ?seqInd_zcharW // !oYY // !eqxx.
- rewrite !cfdotNr opprK !{1}Itau1 ?oYY ?seqInd_zcharW ?cfAut_seqInd //.
- have defY: (eta1 :: eta1^*)%CF =i Y.
- apply: proj1 (leq_size_perm _ _ _); last by rewrite szY2.
- by rewrite /= inE eq_sym (seqInd_conjC_neq _ _ _ Yeta1).
- by apply/allP; rewrite /= Yeta1 cfAut_seqInd.
- rewrite -defY !inE in Yeta; case/pred2P: Yeta => ->.
- rewrite eqxx eq_sym (negPf (seqInd_conjC_neq _ _ _ Yeta1)) //.
- by rewrite addrC !subrr.
- by rewrite eqxx eq_sym (negPf (seqInd_conjC_neq _ _ _ Yeta1)) ?add0r ?addr0.
- pose tau2_X xi := tau (xi - a xi *: eta1) + a xi *: Y1.
- pose tau3_Y eta := tau (eta - eta1) + Y1.
- have Itau2_X: {in X, isometry tau2_X, to 'Z[irr G]}.
- split=> [xi1 xi2 Xxi1 Xxi2 | xi Xxi]; last first.
- by rewrite rpredD ?rpredZ_Cint ?Za ?Ztau ?Zalpha.
- rewrite /= cfdotDl !cfdotDr Itau ?Zalpha // cfdotBl !cfdotBr opprB !cfdotZr.
- rewrite !aut_Cint ?Za // !cfdotZl (cfdotC Y1) !alphaY // n1Y1 n1eta rmorphN.
- rewrite aut_Cint // (cfdotC eta1) !(orthogonalP oXY _ eta1) // conjC0.
- by rewrite !mulr0 !subr0 !mulr1 !mulrN mulrC !addrA subrK addrK.
- have{Itau2_X} [tau2 Dtau2 Itau2] := Zisometry_of_iso oX Itau2_X.
- have{Itau2} cohX: coherent_with X L^# tau tau2.
- split=> // xi; rewrite zcharD1E => /andP[/zchar_expansion[]// z Zz ->{xi}].
- pose sum_za := \sum_(xi <- X) z xi * a xi => /eqP sum_xi_0.
- have{sum_xi_0} sum_za_0: sum_za = 0.
- apply: (mulIf (neq0CG W1)); rewrite mul0r -{}sum_xi_0 sum_cfunE mulr_suml.
- by apply: eq_big_seq => xi /Dxa[xi_1 _]; rewrite !cfunE xi_1 mulrA.
- rewrite -[rhs in tau rhs](subrK (sum_za *: eta1)) {1}scaler_suml -sumrB.
- rewrite -[tau _](addrK (sum_za *: Y1)) {1 3}sum_za_0 !scale0r addr0 subr0.
- rewrite scaler_suml !raddf_sum [tau _]raddf_sum -big_split /= -/tau.
- apply: eq_big_seq => xi Xxi; rewrite raddfZ_Cint //= Dtau2 //.
- by rewrite -!scalerA -scalerBr [tau _]linearZ -scalerDr.
- have Itau3_Y: {in Y, isometry tau3_Y, to 'Z[irr G]}.
- split=> [eta3 eta4 Yeta3 Yeta4 | eta Yeta]; last first.
- by rewrite rpredD // Ztau ?Zbeta.
- rewrite /= cfdotDl !cfdotDr n1Y1 (cfdotC Y1) !betaY // Itau ?Zbeta //.
- rewrite cfdotBl !cfdotBr !oYY // eqxx rmorphB rmorph1 rmorph_nat subrK.
- rewrite (eq_sym eta1) opprB !addrA 3!(addrAC _ (- _)) addrK.
- by rewrite(addrAC _ 1) subrK addrK.
- have{oY} oY := orthonormal_orthogonal oY.
- have{Itau3_Y} [tau3 Dtau3 Itau3] := Zisometry_of_iso oY Itau3_Y.
- have{Itau3 cohY} cohY: coherent_with Y L^# tau tau3.
- split=> // eta; rewrite zcharD1E => /andP[/zchar_expansion[]//z Zz ->{eta}].
- pose sum_z := \sum_(eta <- Y) z eta => /eqP sum_eta_0.
- have{sum_eta_0} sum_z_0: sum_z = 0.
- apply: (mulIf (neq0CG W1)); rewrite mul0r -sum_eta_0 sum_cfunE mulr_suml.
- by apply: eq_big_seq => xi /uniY eta_1; rewrite !cfunE eta_1.
- rewrite -[rhs in tau rhs](subrK (sum_z *: eta1)) {1}scaler_suml -sumrB.
- rewrite -[tau _](addrK (sum_z *: Y1)) {1 3}sum_z_0 !scale0r addr0 subr0.
- rewrite scaler_suml !raddf_sum [tau _]raddf_sum -big_split /= -/tau.
- apply: eq_big_seq => eta Yeta; rewrite raddfZ_Cint //= Dtau3 //.
- by rewrite -scalerBr [tau _]linearZ -scalerDr.
- have [-> | ] := altP (@nilP _ X); first by exists tau3.
- rewrite -lt0n -has_predT => /hasP[xi1 Xxi1 _].
- have: tau (xi1 - a xi1 *: eta1) = tau2 xi1 - tau3 (a xi1 *: eta1).
- rewrite [tau3 _]linearZ Dtau2 //= Dtau3 // /tau3_Y subrr [tau 0]linear0.
- by rewrite add0r addrK.
- apply: (bridge_coherent scohS ccsXS cohX ccsYS cohY X'Y).
- by rewrite (zchar_on (Zalpha _ Xxi1)) // rpredZ_Cint ?mem_zchar.
-pose wf S1 := cfConjC_subset S1 S /\ {subset X ++ Y <= S1}.
+ 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 wfS1: wf S1.
- do 2!split=> //; rewrite /S1 /= ?cat_uniq ?uX ?uY ?(introT hasPn) //.
+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=> phi; rewrite !mem_cat => /orP[/ccX|/ccY]->; rewrite ?orbT.
-move: {2}_.+1 (ltnSn (size S - size S1)) => n.
-elim: n => // n IHn in (S2) S1 wfS1 cohXY *; rewrite ltnS => leSnS1.
-have [ccsS1S sXYS1] := wfS1; have [uS1 sS1S ccS1] := ccsS1S.
-have [sSS1 | /allPn[psi /= Spsi notS1psi]] := altP (@allP _ (mem S1) S).
- exact: subset_coherent cohXY.
-have [_ _ ccS] := uccS.
-have [neq_psi_c Spsic] := (hasPn nrS _ Spsi, ccS _ Spsi).
-have wfS1': wf [:: psi, psi^* & S1]%CF.
- split; last by move=> xi XYxi; rewrite !inE sXYS1 ?orbT.
- split=> [|xi|xi]; rewrite /= !inE.
- - by rewrite negb_or eq_sym neq_psi_c notS1psi (contra (ccS1 _)) ?cfConjCK.
- - by do 2?[case/predU1P=> [-> //|]] => /sS1S.
- rewrite (inv_eq (@cfConjCK _ _)) (can_eq (@cfConjCK _ _)) orbCA !orbA.
- by case: pred2P => // _ /ccS1.
-apply: (IHn [:: psi, psi^* & S2]%CF) => //; last first.
- rewrite -subSn ?uniq_leq_size //; try by have [[]] := wfS1'.
- by rewrite /= subSS (leq_trans _ leSnS1) // leq_sub2l ?leqW.
-have ltZH': Z \proper H^`(1)%g.
- rewrite properEneq sZH' andbT; apply: contraNneq notS1psi => eqZH'.
- have [i /setDP[_ nt_i] ->] := seqIndP Spsi; rewrite sXYS1 // mem_cat.
- rewrite !mem_seqInd ?normal1 //= -eqZH' !inE in nt_i *.
- by rewrite sub1G nt_i andbT orNb.
-have: [/\ eta1 \in S1, psi \in S & psi \notin S1].
- by rewrite Spsi sXYS1 // mem_cat Yeta1 orbT.
+ 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.
-move/(extend_coherent scohS ccsS1S); apply; split=> //.
- rewrite (uniY _ Yeta1) Dpsi cfInd1 // (index_sdprod defL) dvdC_mulr //.
+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 //= (big_rem _ Yeta1) /= addrC -!addrA -big_cat //=.
-rewrite sum_seqIndD_square ?normal1 ?sub1G // indexg1 addrC.
-rewrite -subr_gt0 -!addrA ltr_spaddl //.
- have /irrY/irrP[j ->] := Yeta1.
- by rewrite cfnorm_irr divr1 exprn_gt0 ?irr1_gt0.
-rewrite big_seq addr_ge0 ?sumr_ge0 // => [phi Sphi|].
- rewrite mulr_ge0 ?invr_ge0 ?cfnorm_ge0 ?exprn_ge0 // ?char1_pos //.
- suffices /seqInd_char: phi \in S by apply: char1_ge0.
- rewrite sS1S // !mem_cat; rewrite mem_cat in Sphi.
- by case/orP: Sphi => [/mem_rem-> | ->]; rewrite ?orbT.
-rewrite subr_ge0 -(Lagrange_index sHL sZH) -oW1 natrM mulrC -mulrA.
-rewrite uniY ?ler_pmul2l ?gt0CG //.
-rewrite -(prednK (cardG_gt0 Z)) [zz in zz - 1]mulrSr addrK -natrM.
-rewrite Dpsi cfInd1 // -oW1.
-rewrite -(@ler_pexpn2r _ 2) -?topredE /= ?mulr_ge0 ?ler0n //; last first.
- by rewrite char1_ge0 ?irr_char.
-rewrite !exprMn -!natrX mulrA -natrM.
-apply: ler_trans (_ : (4 * #|W1| ^ 2)%:R * #|H : Z|%:R <= _).
- rewrite ler_pmul2l; last by rewrite ltr0n muln_gt0 !expn_gt0 cardG_gt0.
- rewrite (ler_trans (irr1_bound i)) // ler_nat dvdn_leq // indexgS //.
- by rewrite (subset_trans sZZ) // -cap_cfcenter_irr bigcap_inf.
-rewrite -natrM ler_nat expnMn mulnC -mulnA leq_pmul2l //.
+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.
- have regW1Z: semiregular Z W1.
- have [in_c1 | in_c2] := boolP case_c1.
- move=> x /(Frobenius_reg_ker in_c1) regHx; apply/trivgP.
- by rewrite -regHx setSI.
- have [/= _ [_ [_ _ _ prW1H] _] _ _] := c2W2 in_c2.
- move=> x /prW1H prHx; apply/trivgP; rewrite -((_ =P [1]) in_caseA) -prHx.
- by rewrite subsetI subIset ?sZZ // setSI.
- rewrite -(mul1n (4 * _)%N) leq_mul // -(expnMn 2 _ 2) leq_exp2r //.
- rewrite dvdn_leq //; first by rewrite -subn1 subn_gt0 cardG_gt1.
- rewrite Gauss_dvd ?(@pnat_coprime 2) -?odd_2'nat ?(oddSg sW1L) //.
- rewrite dvdn2 -{1}subn1 odd_sub // (oddSg (normal_sub nsZL)) //=.
- by rewrite regular_norm_dvd_pred // (subset_trans sW1L) ?normal_norm.
-rewrite -(muln1 (4 * _)%N) leq_mul //; last first.
- by rewrite expn_gt0 -subn1 subn_gt0 orbF cardG_gt1.
-rewrite -(expnMn 2 _ 2) -(Lagrange_index (der_sub 1 H) sZH') leq_mul //.
- rewrite -(prednK (indexg_gt0 _ _)) leqW // dvdn_leq //.
- by rewrite -subn1 subn_gt0 indexg_gt1 proper_subn.
- rewrite Gauss_dvd ?(@pnat_coprime 2) -?odd_2'nat ?(oddSg sW1L) //.
- rewrite dvdn2 -{1}subn1 odd_sub // -card_quotient ?der_norm //.
- rewrite quotient_odd ?(oddSg sHL) //=.
- rewrite (card_isog (quotient_isog (subset_trans sW1L nH'L) _)); last first.
- by rewrite coprime_TIg ?(coprimeSg (der_sub 1 H)).
- exact: Frobenius_dvd_ker1 frobL1.
-rewrite -(prednK (indexg_gt0 _ _)) leqW // dvdn_leq //.
- by rewrite -subn1 subn_gt0 indexg_gt1 proper_subn.
-rewrite Gauss_dvd ?(@pnat_coprime 2) -?odd_2'nat ?(oddSg sW1L) //.
-rewrite dvdn2 -{1}subn1 odd_sub //.
-rewrite -card_quotient ?(subset_trans (der_sub 1 H)) //.
-rewrite quotient_odd ?(oddSg (der_sub 1 H)) ?(oddSg sHL) //=.
-have /andP[sZL nZL] := nsZL.
-rewrite (card_isog (quotient_isog (subset_trans sW1L nZL) _)); last first.
- by rewrite coprime_TIg ?(coprimeSg sZH).
-suffices: [Frobenius (H^`(1) / Z) <*> (W1 / Z) = (H^`(1) / Z) ><| (W1 / Z)]%g.
- exact: Frobenius_dvd_ker1.
-suffices: [Frobenius (L / Z) = (H / Z) ><| (W1 / Z)]%g.
- apply: Frobenius_subl (quotientS Z (der_sub 1 H)) _.
- by rewrite quotient_neq1 // (normalS sZH' (der_sub 1 H)).
+ 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].
- exact: sub_proper_trans sZH' ltH'H.
-have /caseB_P[/c2W2[_ [_ [_ _ _ -> //] _] _ _] _ _] := in_caseB.
-by rewrite /Z (negPf in_caseB).
+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
index eed77b7..dcf7f8f 100644
--- a/mathcomp/odd_order/PFsection7.v
+++ b/mathcomp/odd_order/PFsection7.v
@@ -1,10 +1,18 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
(******************************************************************************)
@@ -149,7 +157,7 @@ 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; exact: invDade_on. Qed.
+Proof. by apply: cfnormE; apply: invDade_on. Qed.
End InverseDade.
@@ -365,7 +373,7 @@ 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; exact: seqInd_zcharW.
+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.
@@ -675,7 +683,7 @@ have /fin_all_exists[r lin_r] i: exists r, 'chi_r \in S i /\ 'chi_r 1%g = e_ 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 (mem_irr _) (Sr i).
+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.
@@ -797,8 +805,8 @@ 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 /orP: 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.
+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.
diff --git a/mathcomp/odd_order/PFsection8.v b/mathcomp/odd_order/PFsection8.v
index 72a0d00..4c6f14d 100644
--- a/mathcomp/odd_order/PFsection8.v
+++ b/mathcomp/odd_order/PFsection8.v
@@ -1,14 +1,25 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
Require ssrnum.
+From mathcomp
Require Import algC classfun character inertia vcharacter.
+From mathcomp
Require Import PFsection1 PFsection2 PFsection3 PFsection4 PFsection5.
(******************************************************************************)
@@ -245,7 +256,7 @@ have piU0p: p \in \pi(U0).
rewrite -pi_of_exponent expU0 pi_of_exponent (pi_of_dvd _ _ piW1p) //=.
rewrite -(@dvdn_pmul2l #|H|) ?cardG_gt0 // (sdprod_card defM_K).
rewrite -(sdprod_card defM) dvdn_pmul2r ?cardSg //.
- by case/sdprodP: defM' => _ <- _ _; exact: mulG_subl.
+ 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.
@@ -307,7 +318,7 @@ have ctiW: cyclicTI_hypothesis G defW by split; rewrite ?mFT_odd.
split=> //; first by rewrite dprodE ?subsetIr //= setIA tiHU setI1g.
split.
apply: subset_trans (_ : U :&: 'F(M) \subset _).
- by rewrite subsetI der_sub (subset_trans (dergS 1 sUM')).
+ by rewrite 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.
@@ -512,7 +523,7 @@ split=> // [|S /SylowP[p _ sylS] ntS].
exact: pHall_subl (pcore_sub _ M) (Fcore_Hall M).
have s_p: p \in \sigma(M).
by rewrite (pnatPpi sMs) // -p_rank_gt0 -(rank_Sylow sylS) rank_gt0.
-by apply: (norm_sigma_Sylow s_p); exact: (subHall_Sylow (Msigma_Hall maxM)).
+by apply: (norm_sigma_Sylow s_p); apply: (subHall_Sylow (Msigma_Hall maxM)).
Qed.
(* This is Peterfalvi (8.12). *)
@@ -601,7 +612,7 @@ Let is_FTsignalizer : is_Dade_signalizer G M 'A0(M) 'R_M.
Proof.
rewrite /'R_M => x A0x /=; rewrite setTI.
case: ifPn => [sCxM | not_sCxM]; first by rewrite sdprod1g (setIidPr sCxM).
-by have [_ _ /(_ x)[| [] //]] := FTsupport_facts; exact/setIdP.
+by have [_ _ /(_ x)[| [] //]] := FTsupport_facts; apply/setIdP.
Qed.
(* This is Peterfalvi (8.15), second assertion. *)
@@ -957,15 +968,15 @@ have{PG} ->: PG = [set class_support M^~~ G | M : {group gT} in 'M].
have [c1 c2] := mFT_partition gT.
split=> [M H maxM maxH eq_MH | Gtype1 | S T W W1 W2 defW VG pairST].
- apply: injMG => //; move/sMG_M in maxM; move/sMG_M in maxH.
- apply/orbit_transl/idPn => not_HG_M.
+ 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 => <-; exact: mem_imset.
+ 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_transr _ (mem_orbit _ _ _)) ?in_setT // orbit_sym.
+ 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).
@@ -1035,16 +1046,16 @@ have part_a2 S T (maxS : S \in 'M) (maxT : T \in 'M) (ncST : NC S T) :
by rewrite sub1set !inE ntx.
by apply/trivgPn; exists z; rewrite //= -defTs inE Ts_z cent_set1 cent1C.
split; last by case/mem_uniq_mmax: uniqCx.
- by apply: contra ncST => /(eq_uniq_mmax uniqCx maxS)->; exact: orbit_refl.
+ 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; exact/andP.
+ by rewrite (eq_uniq_mmax uniqCx maxT sCxT); exists x; apply/andP.
exists x; rewrite (subsetP (FTsupp1_sub maxS)) //=.
- by apply/andP/part_a2=> //; exact/setIP.
+ 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]]].
@@ -1074,7 +1085,7 @@ have part_b S T (maxS : S \in 'M) (maxT : T \in 'M) (ncST : NC S T) :
rewrite class_supportGidr ?inE {z}//.
case/imset2P=> _ z /rcosetP[y Hy ->] _ def_x2.
exists z^-1%g; rewrite part_a1 ?mmaxJ //; last first.
- by rewrite /NC (orbit_transr _ (mem_orbit _ _ _)) ?inE.
+ 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).
@@ -1093,7 +1104,7 @@ move=> S T maxS maxT ncST; split; first split; auto.
apply/orP/idPn; rewrite negb_or -part_b // => /andP[suppST /negP[]].
without loss{suppST} suppST: T maxT ncST / FTsupports S T.
move=> IH; case/existsP: suppST => x /IH {IH}.
- rewrite FT_Dade1_supportJ (orbit_transr _ (mem_orbit _ _ _)) ?in_setT //.
+ 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.
@@ -1101,7 +1112,7 @@ have [_ [_ /(_ y Dy) uCy] /(_ y Dy)[_ coTcS _ typeT]] := FTsupport_facts maxS.
rewrite -mem_iota -(eq_uniq_mmax uCy maxT sCyT) !inE in coTcS typeT.
apply/negbNE; rewrite -part_b /NC 1?orbit_sym // negb_exists.
apply/forallP=> x; rewrite part_a1 ?mmaxJ ?negbK //; last first.
- by rewrite /NC (orbit_transr _ (mem_orbit _ _ _)) ?in_setT // orbit_sym.
+ 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.
diff --git a/mathcomp/odd_order/PFsection9.v b/mathcomp/odd_order/PFsection9.v
index 361d5fe..c2e28bb 100644
--- a/mathcomp/odd_order/PFsection9.v
+++ b/mathcomp/odd_order/PFsection9.v
@@ -1,13 +1,24 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+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.
(******************************************************************************)
@@ -245,14 +256,11 @@ have nsH0C: H0C <| M.
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 (subset_trans (der_sub 1 U)) //=.
- rewrite -{1}defM sdprodEY //= -defHU sdprodEY //=.
- rewrite !join_subG gFnorm cents_norm 1?centsC //=.
- by rewrite (char_norm_trans (der_char _ _)).
-suffices ->: H0C' :=: H0 <*> H0C^`(1).
- by rewrite normalY ?(char_normal_trans (der_char _ _)).
-rewrite /= -?quotientYK ?(subset_trans (der_sub _ _)) ?subsetIl //=.
-by rewrite !quotient_der ?cosetpreK ?subsetIl.
+ 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.
@@ -537,9 +545,9 @@ have{cEE} [F [outF [inF outFK inFK] E_F]]:
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; exact: E_F.
+ 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 //; exact: envelop_mx1.
+ 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.
@@ -589,7 +597,7 @@ 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; exact: in2W.
+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.
@@ -598,7 +606,7 @@ have Dphi: 'dom (invm injm_phi') = Hbar.
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; exact: invmK.
+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.
@@ -704,15 +712,15 @@ exists F.
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; exact: rmorph_nat.
+ 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 => //; exact: etaRM.
+ by apply: prim_r => //; apply: etaRM.
apply/eqP; rewrite eqEcard; apply/andP; split.
- by apply/subsetP=> _ /imsetP[w Ww ->]; rewrite inE fPr0 //; exact: etaRM.
+ 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; exact: etaRM.
+ 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].
@@ -780,13 +788,11 @@ have nb_redM K:
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 [[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.
- by apply: contra red_phi => /cfMod_irr/= ->.
- have red_j: redM (muK j).
- apply: contra (prTIred_not_irr ptiWMb j) => /(cfQuo_irr nsKM).
- by rewrite cfker_mod ?cfModK // => ->.
+ 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.
@@ -901,7 +907,7 @@ have Dtheta f: {in W1bar & H1, forall w xb, theta f (xb ^ w) = 'chi_(f w) xb}.
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 apply: cfDprodl_lin_char.
+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.
@@ -1199,7 +1205,7 @@ have ->: #|Mtheta| = (#|Xtheta| * a)%N.
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 ->; have [i j _ _ Dr] := imset2P Mr.
+ 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.
@@ -1328,7 +1334,7 @@ have Part_a': part_a'.
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 ?(subset_trans (der_sub 1 _)) ?quotient_der //= -/C.
+ 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.
@@ -1632,14 +1638,14 @@ without loss [[eqS12 irrS1 H0C_S1] [Da_p defC] [S3qu ne_qa_qu] [oS1 oS1ua]]:
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) _ xi) => //; first by rewrite S0chi sS12.
+ 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'.
+ 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'.
@@ -2112,9 +2118,8 @@ have [Gamma [S4_Gamma normGamma [b Dbeta]]]:
by have [_ _ ->] := sS10.
rewrite Dbeta -Dtau3 //; apply: contraNneq => ->.
rewrite add0r raddfB cfdotBr !(orthoPl oG'4) ?map_f ?subr0 //.
- rewrite mem_filter /= negbK /= S3lam1s irr_aut.
- move: S4lam1; rewrite mem_filter /= negbK /= -andbA => /and3P[-> H0Clam1 _].
- by rewrite cfAut_seqInd.
+ 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.
diff --git a/mathcomp/odd_order/all.v b/mathcomp/odd_order/all.v
deleted file mode 100644
index 613acb0..0000000
--- a/mathcomp/odd_order/all.v
+++ /dev/null
@@ -1,33 +0,0 @@
-Require Export BGappendixAB.
-Require Export BGappendixC.
-Require Export BGsection10.
-Require Export BGsection11.
-Require Export BGsection12.
-Require Export BGsection13.
-Require Export BGsection14.
-Require Export BGsection15.
-Require Export BGsection16.
-Require Export BGsection1.
-Require Export BGsection2.
-Require Export BGsection3.
-Require Export BGsection4.
-Require Export BGsection5.
-Require Export BGsection6.
-Require Export BGsection7.
-Require Export BGsection8.
-Require Export BGsection9.
-Require Export PFsection10.
-Require Export PFsection11.
-Require Export PFsection12.
-Require Export PFsection13.
-Require Export PFsection14.
-Require Export PFsection1.
-Require Export PFsection2.
-Require Export PFsection3.
-Require Export PFsection4.
-Require Export PFsection5.
-Require Export PFsection6.
-Require Export PFsection7.
-Require Export PFsection8.
-Require Export PFsection9.
-Require Export stripped_odd_order_theorem.
diff --git a/mathcomp/odd_order/wielandt_fixpoint.v b/mathcomp/odd_order/wielandt_fixpoint.v
index beebc3d..d91210b 100644
--- a/mathcomp/odd_order/wielandt_fixpoint.v
+++ b/mathcomp/odd_order/wielandt_fixpoint.v
@@ -1,9 +1,16 @@
(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
-Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div.
+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.
-Require Import morphism perm automorphism quotient action commutator gproduct.
-Require Import zmodp cyclic center pgroup gseries nilpotent sylow finalg.
-Require Import finmodule abelian frobenius maximal extremal hall finmodule.
+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.
(******************************************************************************)
@@ -36,12 +43,12 @@ 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)) := char_norm_trans (Ohm_char 1 A) nAX.
+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=> xpn; case/imsetP=> x Ax ->{xpn}; rewrite !inE groupX //.
+ 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)) := char_norm_trans (Mho_char n A) nAX.
+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).
@@ -49,7 +56,7 @@ have [B minB sBAn]: {B : {group gT} | minnormal B X & B \subset 'Mho^n(A)}.
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.
-case/mingroupP: minB; case/andP=> ntB nBX minB.
+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 _).
@@ -73,14 +80,14 @@ have [U1 | {defA1 minB}ntU] := eqsVneq U 1.
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)) := char_norm_trans (Phi_char A) nAX.
+ 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 // (char_norm_trans (Mho_char n H)) //.
+ 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.
@@ -114,7 +121,7 @@ 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 exact: quotient_norms.
+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.
@@ -146,7 +153,7 @@ have tiUK1: U :&: K1 = 1.
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) := char_norm_trans (Mho_char 1 K) nKX.
+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) //.
@@ -185,7 +192,7 @@ 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)) := char_norm_trans (Phi_char D) nDX.
+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)
@@ -205,17 +212,17 @@ have [f [injf im_f act_f]]:
- by rewrite (subsetP (morphim_norm _ _)) ?mem_morphim.
rewrite morphim_restrm (setIidPr (Phi_sub _)).
by rewrite (subsetP (morphim_norm _ _)) ?mem_quotient.
-apply/mingroupP; split=> [|Y].
- rewrite -subG1 quotient_sub1 ?(normal_norm (Phi_normal _)) //.
+apply/mingroupP; split=> [|Y /andP[ntY actsXY] sYD].
+ rewrite -subG1 quotient_sub1 ?gFnorm //.
by rewrite proper_subn ?Phi_proper // actsQ.
-case/andP=> ntY actsXY sYD; have{minKu} [_ minKu] := mingroupP minKu.
+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=> xb; case/morphimP=> x Nx Xx ->{xb}.
+apply/subsetP=> _ /morphimP[x Nx Xx ->].
rewrite 2!inE /= qact_domE ?subsetT // astabsJ.
-rewrite (subsetP (char_norm_trans (Phi_char _) nKuX)) ?mem_quotient //=.
-apply/subsetP=> fy; case/morphimP=> y Dy Yy ->{fy}.
+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.
@@ -243,7 +250,7 @@ have [wT [fL injL [fX injX fJ]]]: exists wT : finGroupType,
{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); [exact: injm_sdpair2 | exact: sdpair_act].
+ 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.
@@ -327,7 +334,7 @@ have simS: forall U, U \in S -> mxsimple aG (gMx U).
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 (char_norm_trans (Phi_char U)).
+ 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.
@@ -353,12 +360,12 @@ have Fp'G: [char 'F_p]^'.-group G.
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); exact: (mx_rsim_irr defVK).
+ 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); exact/mx_rsim_iso.
+ 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.
@@ -574,7 +581,7 @@ have{tiRCW} rCW : 'r('C_W(Ai1)) = rC i.
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) // (char_norm_trans _ nWG1) ?Mho_char.
+ 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).