diff options
| author | Cyril Cohen | 2015-07-17 18:03:31 +0200 |
|---|---|---|
| committer | Cyril Cohen | 2015-07-17 18:03:31 +0200 |
| commit | 532de9b68384a114c6534a0736ed024c900447f9 (patch) | |
| tree | e100a6a7839bf7548ab8a9e053033f8eef3c7492 /mathcomp/odd_order | |
| parent | f180c539a00fd83d8b3b5fd2d5710eb16e971e2e (diff) | |
Updating files + reorganizing everything
Diffstat (limited to 'mathcomp/odd_order')
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 ). + 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). |
