aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/odd_order/PFsection2.v
diff options
context:
space:
mode:
authorEnrico Tassi2018-04-17 16:57:13 +0200
committerEnrico Tassi2018-04-17 16:57:13 +0200
commiteaa90cf9520e43d0b05fc6431a479e6b9559ef0e (patch)
tree8499953a468a8d8be510dd0d60232cbd8984c1ec /mathcomp/odd_order/PFsection2.v
parentc1ec9cd8e7e50f73159613c492aad4c6c40bc3aa (diff)
move odd_order to its own repository
Diffstat (limited to 'mathcomp/odd_order/PFsection2.v')
-rw-r--r--mathcomp/odd_order/PFsection2.v830
1 files changed, 0 insertions, 830 deletions
diff --git a/mathcomp/odd_order/PFsection2.v b/mathcomp/odd_order/PFsection2.v
deleted file mode 100644
index c982642..0000000
--- a/mathcomp/odd_order/PFsection2.v
+++ /dev/null
@@ -1,830 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg poly finset center.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action zmodp.
-From mathcomp
-Require Import gfunctor gproduct cyclic pgroup frobenius ssrnum.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation vector algC classfun character.
-From mathcomp
-Require Import inertia vcharacter PFsection1.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 2: the Dade isometry *)
-(* Defined here: *)
-(* Dade_hypothesis G L A <-> G, L, and A satisfy the hypotheses under which *)
-(* which the Dade isometry relative to G, L and *)
-(* A is well-defined. *)
-(* For ddA : Dade_hypothesis G L A, we also define *)
-(* Dade ddA == the Dade isometry relative to G, L and A. *)
-(* Dade_signalizer ddA a == the normal complement to 'C_L[a] in 'C_G[a] for *)
-(* a in A (this is usually denoted by H a). *)
-(* Dade_support1 ddA a == the set of elements identified with a by the Dade *)
-(* isometry. *)
-(* Dade_support ddA == the natural support of the Dade isometry. *)
-(* The following are used locally in expansion of the Dade isometry as a sum *)
-(* of induced characters: *)
-(* Dade_transversal ddA == a transversal of the L-conjugacy classes *)
-(* of non empty subsets of A. *)
-(* Dade_set_signalizer ddA B == the generalization of H to B \subset A, *)
-(* denoted 'H(B) below. *)
-(* Dade_set_normalizer ddA B == the generalization of 'C_G[a] to B. *)
-(* denoted 'M(B) = 'H(B) ><| 'N_L(B) below. *)
-(* Dade_cfun_restriction ddA B aa == the composition of aa \in 'CF(L, A) *)
-(* with the projection of 'M(B) onto 'N_L(B), *)
-(* parallel to 'H(B). *)
-(* In addition, if sA1A : A1 \subset A and nA1L : L \subset 'N(A1), we have *)
-(* restr_Dade_hyp ddA sA1A nA1L : Dade_hypothesis G L A1 H *)
-(* restr_Dade ddA sA1A nA1L == the restriction of the Dade isometry to *)
-(* 'CF(L, A1). *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory Num.Theory.
-Local Open Scope ring_scope.
-
-Reserved Notation "alpha ^\tau" (at level 2, format "alpha ^\tau").
-
-Section Two.
-
-Variable gT : finGroupType.
-
-(* This is Peterfalvi (2.1). *)
-Lemma partition_cent_rcoset (H : {group gT}) g (C := 'C_H[g]) (Cg := C :* g) :
- g \in 'N(H) -> coprime #|H| #[g] ->
- partition (Cg :^: H) (H :* g) /\ #|Cg :^: H| = #|H : C|.
-Proof.
-move=> nHg coHg; pose pi := \pi(#[g]).
-have notCg0: Cg != set0 by apply/set0Pn; exists g; apply: rcoset_refl.
-have id_pi: {in Cg, forall u, u.`_ pi = g}.
- move=> _ /rcosetP[u /setIP[Hu cgu] ->]; rewrite consttM; last exact/cent1P.
- rewrite (constt_p_elt (pgroup_pi _)) (constt1P _) ?mul1g //.
- by rewrite (mem_p_elt _ Hu) // /pgroup -coprime_pi' // coprime_sym.
-have{id_pi} /and3P[_ tiCg /eqP defC]: normedTI Cg H C.
- apply/normedTI_P; rewrite subsetI subsetIl normsM ?normG ?subsetIr //.
- split=> // x Hx /pred0Pn[u /andP[/= Cu Cxu]]; rewrite !inE Hx /= conjg_set1.
- by rewrite -{2}(id_pi _ Cu) -(conjgKV x u) consttJ id_pi -?mem_conjg.
-have{tiCg} partCg := partition_class_support notCg0 tiCg.
-have{defC} oCgH: #|Cg :^: H| = #|H : C| by rewrite -defC -astab1Js -card_orbit.
-split=> //; congr (partition _ _): (partCg); apply/eqP.
-rewrite eqEcard card_rcoset {1}class_supportEr; apply/andP; split.
- apply/bigcupsP=> x Hx; rewrite conjsgE -rcosetM conjgCV rcosetM mulgA.
- by rewrite mulSg ?mul_subG ?subsetIl // sub1set ?memJ_norm ?groupV.
-have oCg Cx: Cx \in Cg :^: H -> #|Cx| = #|C|.
- by case/imsetP=> x _ ->; rewrite cardJg card_rcoset.
-by rewrite (card_uniform_partition oCg partCg) oCgH mulnC Lagrange ?subsetIl.
-Qed.
-
-Definition is_Dade_signalizer (G L A : {set gT}) (H : gT -> {group gT}) :=
- {in A, forall a, H a ><| 'C_L[a] = 'C_G[a]}.
-
-(* This is Peterfalvi Definition (2.2). *)
-Definition Dade_hypothesis (G L A : {set gT}) :=
- [/\ A <| L, L \subset G, 1%g \notin A,
- (*a*) {in A &, forall x, {subset x ^: G <= x ^: L}}
- & (*b*) exists2 H, is_Dade_signalizer G L A H
- & (*c*) {in A &, forall a b, coprime #|H a| #|'C_L[b]| }].
-
-Variables (G L : {group gT}) (A : {set gT}).
-
-Let pi := [pred p | [exists a in A, p \in \pi('C_L[a])]].
-
-Let piCL a : a \in A -> pi.-group 'C_L[a].
-Proof.
-move=> Aa; apply: sub_pgroup (pgroup_pi _) => p cLa_p.
-by apply/exists_inP; exists a.
-Qed.
-
-Fact Dade_signalizer_key : unit. Proof. by []. Qed.
-Definition Dade_signalizer_def a := 'O_pi^'('C_G[a])%G.
-Definition Dade_signalizer of Dade_hypothesis G L A :=
- locked_with Dade_signalizer_key Dade_signalizer_def.
-
-Hypothesis ddA : Dade_hypothesis G L A.
-Notation H := (Dade_signalizer ddA).
-Canonical Dade_signalizer_unlockable := [unlockable fun H].
-
-Let pi'H a : pi^'.-group (H a). Proof. by rewrite unlock pcore_pgroup. Qed.
-Let nsHC a : H a <| 'C_G[a]. Proof. by rewrite unlock pcore_normal. Qed.
-
-Lemma Dade_signalizer_sub a : H a \subset G.
-Proof. by have /andP[/subsetIP[]] := nsHC a. Qed.
-
-Lemma Dade_signalizer_cent a : H a \subset 'C[a].
-Proof. by have /andP[/subsetIP[]] := nsHC a. Qed.
-
-Let nsAL : A <| L. Proof. by have [->] := ddA. Qed.
-Let sAL : A \subset L. Proof. exact: normal_sub nsAL. Qed.
-Let nAL : L \subset 'N(A). Proof. exact: normal_norm nsAL. Qed.
-Let sLG : L \subset G. Proof. by have [_ ->] := ddA. Qed.
-Let notA1 : 1%g \notin A. Proof. by have [_ _ ->] := ddA. Qed.
-Let conjAG : {in A &, forall x, {subset x ^: G <= x ^: L}}.
-Proof. by have [_ _ _ ? _] := ddA. Qed.
-Let sHG := Dade_signalizer_sub.
-Let cHA := Dade_signalizer_cent.
-Let notHa0 a : H a :* a :!=: set0.
-Proof. by rewrite -cards_eq0 -lt0n card_rcoset cardG_gt0. Qed.
-
-Let HallCL a : a \in A -> pi.-Hall('C_G[a]) 'C_L[a].
-Proof.
-move=> Aa; have [_ _ _ _ [H1 /(_ a Aa)/sdprodP[_ defCa _ _] coH1L]] := ddA.
-have [|//] := coprime_mulGp_Hall defCa _ (piCL Aa).
-apply: sub_pgroup (pgroup_pi _) => p; apply: contraL => /exists_inP[b Ab].
-by apply: (@pnatPpi \pi(_)^'); rewrite -coprime_pi' ?cardG_gt0 ?coH1L.
-Qed.
-
-Lemma def_Dade_signalizer H1 : is_Dade_signalizer G L A H1 -> {in A, H =1 H1}.
-Proof.
-move=> defH1 a Aa; apply/val_inj; rewrite unlock /=; have defCa := defH1 a Aa.
-have /sdprod_context[nsH1Ca _ _ _ _] := defCa.
-by apply/normal_Hall_pcore=> //; apply/(sdprod_normal_pHallP _ (HallCL Aa)).
-Qed.
-
-Lemma Dade_sdprod : is_Dade_signalizer G L A H.
-Proof.
-move=> a Aa; have [_ _ _ _ [H1 defH1 _]] := ddA.
-by rewrite (def_Dade_signalizer defH1) ?defH1.
-Qed.
-Let defCA := Dade_sdprod.
-
-Lemma Dade_coprime : {in A &, forall a b, coprime #|H a| #|'C_L[b]| }.
-Proof. by move=> a b _ Ab; apply: p'nat_coprime (pi'H a) (piCL Ab). Qed.
-Let coHL := Dade_coprime.
-
-Definition Dade_support1 a := class_support (H a :* a) G.
-Local Notation dd1 := Dade_support1.
-
-Lemma mem_Dade_support1 a x : a \in A -> x \in H a -> (x * a)%g \in dd1 a.
-Proof. by move=> Aa Hx; rewrite -(conjg1 (x * a)) !mem_imset2 ?set11. Qed.
-
-(* This is Peterfalvi (2.3), except for the existence part, which is covered *)
-(* below in the NormedTI section. *)
-Lemma Dade_normedTI_P :
- reflect (A != set0 /\ {in A, forall a, H a = 1%G}) (normedTI A G L).
-Proof.
-apply: (iffP idP) => [tiAG | [nzA trivH]].
- split=> [|a Aa]; first by have [] := andP tiAG.
- apply/trivGP; rewrite -(coprime_TIg (coHL Aa Aa)) subsetIidl subsetI cHA.
- by rewrite (subset_trans (normal_sub (nsHC a))) ?(cent1_normedTI tiAG).
-apply/normedTI_memJ_P; split=> // a g Aa Gg.
-apply/idP/idP=> [Aag | Lg]; last by rewrite memJ_norm ?(subsetP nAL).
-have /imsetP[k Lk def_ag] := conjAG Aa Aag (mem_imset _ Gg).
-suffices: (g * k^-1)%g \in 'C_G[a].
- by rewrite -Dade_sdprod ?trivH // sdprod1g inE groupMr ?groupV // => /andP[].
-rewrite !inE groupM ?groupV // ?(subsetP sLG) //=.
-by rewrite conjg_set1 conjgM def_ag conjgK.
-Qed.
-
-(* This is Peterfalvi (2.4)(a) (extended to all a thanks to our choice of H). *)
-Lemma DadeJ a x : x \in L -> H (a ^ x) :=: H a :^ x.
-Proof.
-by move/(subsetP sLG)=> Gx; rewrite unlock -pcoreJ conjIg -cent1J conjGid.
-Qed.
-
-Lemma Dade_support1_id a x : x \in L -> dd1 (a ^ x) = dd1 a.
-Proof.
-move=> Lx; rewrite {1}/dd1 DadeJ // -conjg_set1 -conjsMg.
-by rewrite class_supportGidl ?(subsetP sLG).
-Qed.
-
-Let piHA a u : a \in A -> u \in H a :* a -> u.`_pi = a.
-Proof.
-move=> Aa /rcosetP[{u}u Hu ->]; have pi'u: pi^'.-elt u by apply: mem_p_elt Hu.
-rewrite (consttM _ (cent1P (subsetP (cHA a) u Hu))).
-suffices pi_a: pi.-elt a by rewrite (constt1P pi'u) (constt_p_elt _) ?mul1g.
-by rewrite (mem_p_elt (piCL Aa)) // inE cent1id (subsetP sAL).
-Qed.
-
-(* This is Peterfalvi (2.4)(b). *)
-Lemma Dade_support1_TI : {in A &, forall a b,
- ~~ [disjoint dd1 a & dd1 b] -> exists2 x, x \in L & b = a ^ x}.
-Proof.
-move=> a b Aa Ab /= /pred0Pn[_ /andP[/imset2P[x u /(piHA Aa) def_x Gu ->]]] /=.
-case/imset2P=> y v /(piHA Ab) def_y Gv /(canLR (conjgK v)) def_xuv.
-have def_b: a ^ (u * v^-1) = b by rewrite -def_x -consttJ conjgM def_xuv def_y.
-by apply/imsetP/conjAG; rewrite // -def_b mem_imset ?groupM ?groupV.
-Qed.
-
-(* This is an essential strengthening of Peterfalvi (2.4)(c). *)
-Lemma Dade_cover_TI : {in A, forall a, normedTI (H a :* a) G 'C_G[a]}.
-Proof.
-move=> a Aa; apply/normedTI_P; split=> // [|g Gg].
- by rewrite subsetI subsetIl normsM ?subsetIr ?normal_norm ?nsHC.
-rewrite disjoint_sym => /pred0Pn[_ /andP[/imsetP[u Ha_u ->] Ha_ug]].
-by rewrite !inE Gg /= conjg_set1 -{1}(piHA Aa Ha_u) -consttJ (piHA Aa).
-Qed.
-
-(* This is Peterfalvi (2.4)(c). *)
-Lemma norm_Dade_cover : {in A, forall a, 'N_G(H a :* a) = 'C_G[a]}.
-Proof. by move=> a /Dade_cover_TI /and3P[_ _ /eqP]. Qed.
-
-Definition Dade_support := \bigcup_(a in A) dd1 a.
-Local Notation Atau := Dade_support.
-
-Lemma not_support_Dade_1 : 1%g \notin Atau.
-Proof.
-apply: contra notA1 => /bigcupP[a Aa /imset2P[u x Ha_u _ ux1]].
-suffices /set1P <-: a \in [1] by [].
-have [_ _ _ <-] := sdprodP (defCA Aa).
-rewrite 2!inE cent1id (subsetP sAL) // !andbT.
-by rewrite -groupV -(mul1g a^-1)%g -mem_rcoset -(conj1g x^-1) ux1 conjgK.
-Qed.
-
-Lemma Dade_support_sub : Atau \subset G.
-Proof.
-apply/bigcupsP=> a Aa; rewrite class_support_subG // mul_subG ?sHG //.
-by rewrite sub1set (subsetP sLG) ?(subsetP sAL).
-Qed.
-
-Lemma Dade_support_norm : G \subset 'N(Atau).
-Proof.
-by rewrite norms_bigcup //; apply/bigcapsP=> a _; apply: class_support_norm.
-Qed.
-
-Lemma Dade_support_normal : Atau <| G.
-Proof. by rewrite /normal Dade_support_sub Dade_support_norm. Qed.
-
-Lemma Dade_support_subD1 : Atau \subset G^#.
-Proof. by rewrite subsetD1 Dade_support_sub not_support_Dade_1. Qed.
-
-(* This is Peterfalvi Definition (2.5). *)
-Fact Dade_subproof (alpha : 'CF(L)) :
- is_class_fun <<G>> [ffun x => oapp alpha 0 [pick a in A | x \in dd1 a]].
-Proof.
-rewrite genGid; apply: intro_class_fun => [x y Gx Gy | x notGx].
- congr (oapp _ _); apply: eq_pick => a; rewrite memJ_norm //.
- by apply: subsetP Gy; apply: class_support_norm.
-case: pickP => // a /andP[Aa Ha_u].
-by rewrite (subsetP Dade_support_sub) // in notGx; apply/bigcupP; exists a.
-Qed.
-Definition Dade alpha := Cfun 1 (Dade_subproof alpha).
-
-Lemma Dade_is_linear : linear Dade.
-Proof.
-move=> mu alpha beta; apply/cfunP=> x; rewrite !cfunElock.
-by case: pickP => [a _ | _] /=; rewrite ?mulr0 ?addr0 ?cfunE.
-Qed.
-Canonical Dade_additive := Additive Dade_is_linear.
-Canonical Dade_linear := Linear Dade_is_linear.
-
-Local Notation "alpha ^\tau" := (Dade alpha).
-
-(* This is the validity of Peterfalvi, Definition (2.5) *)
-Lemma DadeE alpha a u : a \in A -> u \in dd1 a -> alpha^\tau u = alpha a.
-Proof.
-move=> Aa Ha_u; rewrite cfunElock.
-have [b /= /andP[Ab Hb_u] | ] := pickP; last by move/(_ a); rewrite Aa Ha_u.
-have [|x Lx ->] := Dade_support1_TI Aa Ab; last by rewrite cfunJ.
-by apply/pred0Pn; exists u; rewrite /= Ha_u.
-Qed.
-
-Lemma Dade_id alpha : {in A, forall a, alpha^\tau a = alpha a}.
-Proof.
-by move=> a Aa; rewrite /= -{1}[a]mul1g (DadeE _ Aa) ?mem_Dade_support1.
-Qed.
-
-Lemma Dade_cfunS alpha : alpha^\tau \in 'CF(G, Atau).
-Proof.
-apply/cfun_onP=> x; rewrite cfunElock.
-by case: pickP => [a /andP[Aa Ha_x] /bigcupP[] | //]; exists a.
-Qed.
-
-Lemma Dade_cfun alpha : alpha^\tau \in 'CF(G, G^#).
-Proof. by rewrite (cfun_onS Dade_support_subD1) ?Dade_cfunS. Qed.
-
-Lemma Dade1 alpha : alpha^\tau 1%g = 0.
-Proof. by rewrite (cfun_on0 (Dade_cfun _)) // !inE eqxx. Qed.
-
-Lemma Dade_id1 :
- {in 'CF(L, A) & 1%g |: A, forall alpha a, alpha^\tau a = alpha a}.
-Proof.
-move=> alpha a Aalpha; case/setU1P=> [-> |]; last exact: Dade_id.
-by rewrite Dade1 (cfun_on0 Aalpha).
-Qed.
-
-Section AutomorphismCFun.
-
-Variable u : {rmorphism algC -> algC}.
-Local Notation "alpha ^u" := (cfAut u alpha).
-
-Lemma Dade_aut alpha : (alpha^u)^\tau = (alpha^\tau)^u.
-Proof.
-apply/cfunP => g; rewrite cfunE.
-have [/bigcupP[a Aa A1g] | notAtau_g] := boolP (g \in Atau).
- by rewrite !(DadeE _ Aa A1g) cfunE.
-by rewrite !(cfun_on0 _ notAtau_g) ?rmorph0 ?Dade_cfunS.
-Qed.
-
-End AutomorphismCFun.
-
-Lemma Dade_conjC alpha : (alpha^*)^\tau = ((alpha^\tau)^*)%CF.
-Proof. exact: Dade_aut. Qed.
-
-(* This is Peterfalvi (2.7), main part *)
-Lemma general_Dade_reciprocity alpha (phi : 'CF(G)) (psi : 'CF(L)) :
- alpha \in 'CF(L, A) ->
- {in A, forall a, psi a = #|H a|%:R ^-1 * (\sum_(x in H a) phi (x * a)%g)} ->
- '[alpha^\tau, phi] = '[alpha, psi].
-Proof.
-move=> CFalpha psiA; rewrite (cfdotEl _ (Dade_cfunS _)).
-pose T := [set repr (a ^: L) | a in A].
-have sTA: {subset T <= A}.
- move=> _ /imsetP[a Aa ->]; have [x Lx ->] := repr_class L a.
- by rewrite memJ_norm ?(subsetP nAL).
-pose P_G := [set dd1 x | x in T].
-have dd1_id: {in A, forall a, dd1 (repr (a ^: L)) = dd1 a}.
- by move=> a Aa /=; have [x Lx ->] := repr_class L a; apply: Dade_support1_id.
-have ->: Atau = cover P_G.
- apply/setP=> u; apply/bigcupP/bigcupP=> [[a Aa Fa_u] | [Fa]]; last first.
- by case/imsetP=> a /sTA Aa -> Fa_u; exists a.
- by exists (dd1 a) => //; rewrite -dd1_id //; do 2!apply: mem_imset.
-have [tiP_G inj_dd1]: trivIset P_G /\ {in T &, injective dd1}.
- apply: trivIimset => [_ _ /imsetP[a Aa ->] /imsetP[b Ab ->] |]; last first.
- apply/imsetP=> [[a]]; move/sTA=> Aa; move/esym; move/eqP; case/set0Pn.
- by exists (a ^ 1)%g; apply: mem_imset2; rewrite ?group1 ?rcoset_refl.
- rewrite !dd1_id //; apply: contraR.
- by case/Dade_support1_TI=> // x Lx ->; rewrite classGidl.
-rewrite big_trivIset //= big_imset {P_G tiP_G inj_dd1}//=.
-symmetry; rewrite (cfdotEl _ CFalpha).
-pose P_A := [set a ^: L | a in T].
-have rLid x: repr (x ^: L) ^: L = x ^: L.
- by have [y Ly ->] := repr_class L x; rewrite classGidl.
-have {1}<-: cover P_A = A.
- apply/setP=> a; apply/bigcupP/idP=> [[_ /imsetP[d /sTA Ab ->]] | Aa].
- by case/imsetP=> x Lx ->; rewrite memJ_norm ?(subsetP nAL).
- by exists (a ^: L); rewrite ?class_refl // -rLid; do 2!apply: mem_imset.
-have [tiP_A injFA]: trivIset P_A /\ {in T &, injective (class^~ L)}.
- apply: trivIimset => [_ _ /imsetP[a Aa ->] /imsetP[b Ab ->] |]; last first.
- by apply/imsetP=> [[a _ /esym/eqP/set0Pn[]]]; exists a; apply: class_refl.
- rewrite !rLid; apply: contraR => /pred0Pn[c /andP[/=]].
- by do 2!move/class_eqP <-.
-rewrite big_trivIset //= big_imset {P_A tiP_A injFA}//=.
-apply: canRL (mulKf (neq0CG G)) _; rewrite mulrA big_distrr /=.
-apply: eq_bigr => a /sTA=> {T sTA}Aa.
-have [La def_Ca] := (subsetP sAL a Aa, defCA Aa).
-rewrite (eq_bigr (fun _ => alpha a * (psi a)^*)) => [|ax]; last first.
- by case/imsetP=> x Lx ->{ax}; rewrite !cfunJ.
-rewrite sumr_const -index_cent1 mulrC -mulr_natr -!mulrA.
-rewrite (eq_bigr (fun xa => alpha a * (phi xa)^*)) => [|xa Fa_xa]; last first.
- by rewrite (DadeE _ Aa).
-rewrite -big_distrr /= -rmorph_sum; congr (_ * _).
-rewrite mulrC mulrA -natrM mulnC -(Lagrange (subsetIl G 'C[a])).
-rewrite -mulnA mulnCA -(sdprod_card def_Ca) -mulnA Lagrange ?subsetIl //.
-rewrite mulnA natrM mulfK ?neq0CG // -conjC_nat -rmorphM; congr (_ ^*).
-have /and3P[_ tiHa _] := Dade_cover_TI Aa.
-rewrite (set_partition_big _ (partition_class_support _ _)) //=.
-rewrite (eq_bigr (fun _ => \sum_(x in H a) phi (x * a)%g)); last first.
- move=> _ /imsetP[x Gx ->]; rewrite -rcosetE.
- rewrite (big_imset _ (in2W (conjg_inj x))) (big_imset _ (in2W (mulIg a))) /=.
- by apply: eq_bigr => u Hu; rewrite cfunJ ?groupM ?(subsetP sLG a).
-rewrite sumr_const card_orbit astab1Js norm_Dade_cover //.
-by rewrite natrM -mulrA mulr_natl psiA // mulVKf ?neq0CG.
-Qed.
-
-(* This is Peterfalvi (2.7), second part. *)
-Lemma Dade_reciprocity alpha (phi : 'CF(G)) :
- alpha \in 'CF(L, A) ->
- {in A, forall a, {in H a, forall u, phi (u * a)%g = phi a}} ->
- '[alpha^\tau, phi] = '[alpha, 'Res[L] phi].
-Proof.
-move=> CFalpha phiH; apply: general_Dade_reciprocity => // a Aa.
-rewrite cfResE ?(subsetP sAL) //; apply: canRL (mulKf (neq0CG _)) _.
-by rewrite mulr_natl -sumr_const; apply: eq_bigr => x Hx; rewrite phiH.
-Qed.
-
-(* This is Peterfalvi (2.6)(a). *)
-Lemma Dade_isometry : {in 'CF(L, A) &, isometry Dade}.
-Proof.
-move=> alpha beta CFalpha CFbeta /=.
-rewrite Dade_reciprocity ?Dade_cfun => // [|a Aa u Hu]; last first.
- by rewrite (DadeE _ Aa) ?mem_Dade_support1 ?Dade_id.
-rewrite !(cfdotEl _ CFalpha); congr (_ * _); apply: eq_bigr => x Ax.
-by rewrite cfResE ?(subsetP sAL) // Dade_id.
-Qed.
-
-(* Supplement to Peterfalvi (2.3)/(2.6)(a); implies Isaacs Lemma 7.7. *)
-Lemma Dade_Ind : normedTI A G L -> {in 'CF(L, A), Dade =1 'Ind}.
-Proof.
-case/Dade_normedTI_P=> _ trivH alpha Aalpha.
-rewrite [alpha^\tau]cfun_sum_cfdot ['Ind _]cfun_sum_cfdot.
-apply: eq_bigr => i _; rewrite -cfdot_Res_r -Dade_reciprocity // => a Aa /= u.
-by rewrite trivH // => /set1P->; rewrite mul1g.
-Qed.
-
-Definition Dade_set_signalizer (B : {set gT}) := \bigcap_(a in B) H a.
-Local Notation "''H' ( B )" := (Dade_set_signalizer B)
- (at level 8, format "''H' ( B )") : group_scope.
-Canonical Dade_set_signalizer_group B := [group of 'H(B)].
-Definition Dade_set_normalizer B := 'H(B) <*> 'N_L(B).
-Local Notation "''M' ( B )" := (Dade_set_normalizer B)
- (at level 8, format "''M' ( B )") : group_scope.
-Canonical Dade_set_normalizer_group B := [group of 'M(B)].
-
-Let calP := [set B : {set gT} | B \subset A & B != set0].
-
-(* This is Peterfalvi (2.8). *)
-Lemma Dade_set_sdprod : {in calP, forall B, 'H(B) ><| 'N_L(B) = 'M(B)}.
-Proof.
-move=> B /setIdP[sBA notB0]; apply: sdprodEY => /=.
- apply/subsetP=> x /setIP[Lx nBx]; rewrite inE.
- apply/bigcapsP=> a Ba; have Aa := subsetP sBA a Ba.
- by rewrite sub_conjg -DadeJ ?groupV // bigcap_inf // memJ_norm ?groupV.
-have /set0Pn[a Ba] := notB0; have Aa := subsetP sBA a Ba.
-have [_ /mulG_sub[sHaC _] _ tiHaL] := sdprodP (defCA Aa).
-rewrite -(setIidPl sLG) -setIA setICA (setIidPl sHaC) in tiHaL.
-by rewrite setICA ['H(B)](bigD1 a) //= !setIA tiHaL !setI1g.
-Qed.
-
-Section DadeExpansion.
-
-Variable aa : 'CF(L).
-Hypothesis CFaa : aa \in 'CF(L, A).
-
-Definition Dade_restrm B :=
- if B \in calP then remgr 'H(B) 'N_L(B) else trivm 'M(B).
-Fact Dade_restrM B : {in 'M(B) &, {morph Dade_restrm B : x y / x * y}%g}.
-Proof.
-rewrite /Dade_restrm; case: ifP => calP_B; last exact: morphM.
-have defM := Dade_set_sdprod calP_B; have [nsHM _ _ _ _] := sdprod_context defM.
-by apply: remgrM; first apply: sdprod_compl.
-Qed.
-Canonical Dade_restr_morphism B := Morphism (@Dade_restrM B).
-Definition Dade_cfun_restriction B :=
- cfMorph ('Res[Dade_restrm B @* 'M(B)] aa).
-
-Local Notation "''aa_' B" := (Dade_cfun_restriction B)
- (at level 3, B at level 2, format "''aa_' B") : ring_scope.
-
-Definition Dade_transversal := [set repr (B :^: L) | B in calP].
-Local Notation calB := Dade_transversal.
-
-Lemma Dade_restrictionE B x :
- B \in calP -> 'aa_B x = aa (remgr 'H(B) 'N_L(B) x) *+ (x \in 'M(B)).
-Proof.
-move=> calP_B; have /sdprodP[_ /= defM _ _] := Dade_set_sdprod calP_B.
-have [Mx | /cfun0-> //] := boolP (x \in 'M(B)).
-rewrite mulrb cfMorphE // morphimEdom /= /Dade_restrm calP_B.
-rewrite cfResE ?mem_imset {x Mx}//= -defM.
-by apply/subsetP=> _ /imsetP[x /mem_remgr/setIP[Lx _] ->].
-Qed.
-Local Notation rDadeE := Dade_restrictionE.
-
-Lemma Dade_restriction_vchar B : aa \in 'Z[irr L] -> 'aa_B \in 'Z[irr 'M(B)].
-Proof.
-rewrite /'aa_B => /vcharP[a1 Na1 [a2 Na2 ->]].
-by rewrite !linearB /= rpredB // char_vchar ?cfMorph_char ?cfRes_char.
-Qed.
-
-Let sMG B : B \in calP -> 'M(B) \subset G.
-Proof.
-case/setIdP=> /subsetP sBA /set0Pn[a Ba].
-by rewrite join_subG ['H(B)](bigD1 a Ba) !subIset ?sLG ?sHG ?sBA.
-Qed.
-
-(* This is Peterfalvi (2.10.1) *)
-Lemma Dade_Ind_restr_J :
- {in L & calP, forall x B, 'Ind[G] 'aa_(B :^ x) = 'Ind[G] 'aa_B}.
-Proof.
-move=> x B Lx dB; have [defMB [sBA _]] := (Dade_set_sdprod dB, setIdP dB).
-have dBx: B :^ x \in calP.
- by rewrite !inE -{2}(normsP nAL x Lx) conjSg -!cards_eq0 cardJg in dB *.
-have defHBx: 'H(B :^ x) = 'H(B) :^ x.
- rewrite /'H(_) (big_imset _ (in2W (conjg_inj x))) -bigcapJ /=.
- by apply: eq_bigr => a Ba; rewrite DadeJ ?(subsetP sBA).
-have defNBx: 'N_L(B :^ x) = 'N_L(B) :^ x by rewrite conjIg -normJ (conjGid Lx).
-have [_ mulHNB _ tiHNB] := sdprodP defMB.
-have defMBx: 'M(B :^ x) = 'M(B) :^ x.
- rewrite -mulHNB conjsMg -defHBx -defNBx.
- by case/sdprodP: (Dade_set_sdprod dBx).
-have def_aa_x y: 'aa_(B :^ x) (y ^ x) = 'aa_B y.
- rewrite !rDadeE // defMBx memJ_conjg !mulrb -mulHNB defHBx defNBx.
- have [[h z Hh Nz ->] | // ] := mulsgP.
- by rewrite conjMg !remgrMid ?cfunJ ?memJ_conjg // -conjIg tiHNB conjs1g.
-apply/cfunP=> y; have Gx := subsetP sLG x Lx.
-rewrite [eq]lock !cfIndE ?sMG //= {1}defMBx cardJg -lock; congr (_ * _).
-rewrite (reindex_astabs 'R x) ?astabsR //=.
-by apply: eq_bigr => z _; rewrite conjgM def_aa_x.
-Qed.
-
-(* This is Peterfalvi (2.10.2) *)
-Lemma Dade_setU1 : {in calP & A, forall B a, 'H(a |: B) = 'C_('H(B))[a]}.
-Proof.
-move=> B a dB Aa; rewrite /'H(_) bigcap_setU big_set1 -/'H(B).
-apply/eqP; rewrite setIC eqEsubset setIS // subsetI subsetIl /=.
-have [sHBG pi'HB]: 'H(B) \subset G /\ pi^'.-group 'H(B).
- have [sBA /set0Pn[b Bb]] := setIdP dB; have Ab := subsetP sBA b Bb.
- have sHBb: 'H(B) \subset H b by rewrite ['H(B)](bigD1 b) ?subsetIl.
- by rewrite (pgroupS sHBb) ?pi'H ?(subset_trans sHBb) ?sHG.
-have [nsHa _ defCa _ _] := sdprod_context (defCA Aa).
-have [hallHa _] := coprime_mulGp_Hall defCa (pi'H a) (piCL Aa).
-by rewrite (sub_normal_Hall hallHa) ?(pgroupS (subsetIl _ _)) ?setSI.
-Qed.
-
-Let calA g (X : {set gT}) := [set x in G | g ^ x \in X]%g.
-
-(* This is Peterfalvi (2.10.3) *)
-Lemma Dade_Ind_expansion B g :
- B \in calP ->
- [/\ g \notin Atau -> ('Ind[G, 'M(B)] 'aa_B) g = 0
- & {in A, forall a, g \in dd1 a ->
- ('Ind[G, 'M(B)] 'aa_B) g =
- (aa a / #|'M(B)|%:R) *
- \sum_(b in 'N_L(B) :&: a ^: L) #|calA g ('H(B) :* b)|%:R}].
-Proof.
-move=> dB; set LHS := 'Ind _ g.
-have defMB := Dade_set_sdprod dB; have [_ mulHNB nHNB tiHNB] := sdprodP defMB.
-have [sHMB sNMB] := mulG_sub mulHNB.
-have{LHS} ->: LHS = #|'M(B)|%:R^-1 * \sum_(x in calA g 'M(B)) 'aa_B (g ^ x).
- rewrite {}/LHS cfIndE ?sMG //; congr (_ * _).
- rewrite (bigID [pred x | g ^ x \in 'M(B)]) /= addrC big1 ?add0r => [|x].
- by apply: eq_bigl => x; rewrite inE.
- by case/andP=> _ notMgx; rewrite cfun0.
-pose fBg x := remgr 'H(B) 'N_L(B) (g ^ x).
-pose supp_aBg := [pred b in A | g \in dd1 b].
-have supp_aBgP: {in calA g 'M(B), forall x,
- ~~ supp_aBg (fBg x) -> 'aa_B (g ^ x)%g = 0}.
-- move=> x /setIdP[]; set b := fBg x => Gx MBgx notHGx; rewrite rDadeE // MBgx.
- have Nb: b \in 'N_L(B) by rewrite mem_remgr ?mulHNB.
- have Cb: b \in 'C_L[b] by rewrite inE cent1id; have [-> _] := setIP Nb.
- rewrite (cfun_on0 CFaa) // -/(fBg x) -/b; apply: contra notHGx => Ab.
- have nHb: b \in 'N('H(B)) by rewrite (subsetP nHNB).
- have [sBA /set0Pn[a Ba]] := setIdP dB; have Aa := subsetP sBA a Ba.
- have [|/= partHBb _] := partition_cent_rcoset nHb.
- rewrite (coprime_dvdr (order_dvdG Cb)) //= ['H(B)](bigD1 a) //=.
- by rewrite (coprimeSg (subsetIl _ _)) ?coHL.
- have Hb_gx: g ^ x \in 'H(B) :* b by rewrite mem_rcoset mem_divgr ?mulHNB.
- have [defHBb _ _] := and3P partHBb; rewrite -(eqP defHBb) in Hb_gx.
- case/bigcupP: Hb_gx => Cy; case/imsetP=> y HBy ->{Cy} Cby_gx.
- have sHBa: 'H(B) \subset H a by rewrite bigcap_inf.
- have sHBG: 'H(B) \subset G := subset_trans sHBa (sHG a).
- rewrite Ab -(memJ_conjg _ x) class_supportGidr // -(conjgKV y (g ^ x)).
- rewrite mem_imset2 // ?(subsetP sHBG) {HBy}// -mem_conjg.
- apply: subsetP Cby_gx; rewrite {y}conjSg mulSg //.
- have [nsHb _ defCb _ _] := sdprod_context (defCA Ab).
- have [hallHb _] := coprime_mulGp_Hall defCb (pi'H b) (piCL Ab).
- rewrite (sub_normal_Hall hallHb) ?setSI // (pgroupS _ (pi'H a)) //=.
- by rewrite subIset ?sHBa.
-split=> [notHGg | a Aa Hag].
- rewrite big1 ?mulr0 // => x; move/supp_aBgP; apply; set b := fBg x.
- by apply: contra notHGg; case/andP=> Ab Hb_x; apply/bigcupP; exists b.
-rewrite -mulrA mulrCA; congr (_ * _); rewrite big_distrr /=.
-set nBaL := _ :&: _; rewrite (bigID [pred x | fBg x \in nBaL]) /= addrC.
-rewrite big1 ?add0r => [|x /andP[calAx not_nBaLx]]; last first.
- apply: supp_aBgP => //; apply: contra not_nBaLx.
- set b := fBg x => /andP[Ab Hb_g]; have [Gx MBx] := setIdP calAx.
- rewrite inE mem_remgr ?mulHNB //; apply/imsetP/Dade_support1_TI => //.
- by apply/pred0Pn; exists g; apply/andP.
-rewrite (partition_big fBg (mem nBaL)) /= => [|x]; last by case/andP.
-apply: eq_bigr => b; case/setIP=> Nb aLb; rewrite mulr_natr -sumr_const.
-apply: eq_big => x; rewrite ![x \in _]inE -!andbA.
- apply: andb_id2l=> Gx; apply/and3P/idP=> [[Mgx _] /eqP <- | HBb_gx].
- by rewrite mem_rcoset mem_divgr ?mulHNB.
- suffices ->: fBg x = b.
- by rewrite inE Nb (subsetP _ _ HBb_gx) // -mulHNB mulgS ?sub1set.
- by rewrite /fBg; have [h Hh ->] := rcosetP HBb_gx; apply: remgrMid.
-move/and4P=> [_ Mgx _ /eqP def_fx].
-rewrite rDadeE // Mgx -/(fBg x) def_fx; case/imsetP: aLb => y Ly ->.
-by rewrite cfunJ // (subsetP sAL).
-Qed.
-
-(* This is Peterfalvi (2.10) *)
-Lemma Dade_expansion :
- aa^\tau = - \sum_(B in calB) (- 1) ^+ #|B| *: 'Ind[G, 'M(B)] 'aa_B.
-Proof.
-apply/cfunP=> g; rewrite !cfunElock sum_cfunE.
-pose n1 (B : {set gT}) : algC := (-1) ^+ #|B| / #|L : 'N_L(B)|%:R.
-pose aa1 B := ('Ind[G, 'M(B)] 'aa_B) g.
-have dBJ: {acts L, on calP | 'Js}.
- move=> x Lx /= B; rewrite !inE -!cards_eq0 cardJg.
- by rewrite -{1}(normsP nAL x Lx) conjSg.
-transitivity (- (\sum_(B in calP) n1 B * aa1 B)); last first.
- congr (- _); rewrite {1}(partition_big_imset (fun B => repr (B :^: L))) /=.
- apply: eq_bigr => B /imsetP[B1 dB1 defB].
- have B1L_B: B \in B1 :^: L by rewrite defB (mem_repr B1) ?orbit_refl.
- have{dB1} dB1L: {subset B1 :^: L <= calP}.
- by move=> _ /imsetP[x Lx ->]; rewrite dBJ.
- have dB: B \in calP := dB1L B B1L_B.
- rewrite (eq_bigl (mem (B :^: L))) => [|B2 /=]; last first.
- apply/andP/idP=> [[_ /eqP <-] | /orbit_trans/(_ B1L_B)-B1L_B2].
- by rewrite orbit_sym (mem_repr B2) ?orbit_refl.
- by rewrite [B2 :^: L](orbit_eqP B1L_B2) -defB dB1L.
- rewrite (eq_bigr (fun _ => n1 B * aa1 B)) => [|_ /imsetP[x Lx ->]].
- rewrite cfunE sumr_const -mulr_natr mulrAC card_orbit astab1Js divfK //.
- by rewrite pnatr_eq0 -lt0n indexg_gt0.
- rewrite /aa1 Dade_Ind_restr_J //; congr (_ * _).
- by rewrite /n1 cardJg -{1 2}(conjGid Lx) normJ -conjIg indexJg.
-case: pickP => /= [a /andP[Aa Ha_g] | notHAg]; last first.
- rewrite big1 ?oppr0 // /aa1 => B dB.
- have [->] := Dade_Ind_expansion g dB; first by rewrite mulr0.
- by apply/bigcupP=> [[a Aa Ha_g]]; case/andP: (notHAg a).
-pose P_ b := [set B in calP | b \in 'N_L(B)].
-pose aa2 B b : algC := #|calA g ('H(B) :* b)|%:R.
-pose nn2 (B : {set gT}) : algC := (-1) ^+ #|B| / #|'H(B)|%:R.
-pose sumB b := \sum_(B in P_ b) nn2 B * aa2 B b.
-transitivity (- aa a / #|L|%:R * \sum_(b in a ^: L) sumB b); last first.
- rewrite !mulNr; congr (- _).
- rewrite (exchange_big_dep (mem calP)) => [|b B _] /=; last by case/setIdP.
- rewrite big_distrr /aa1; apply: eq_bigr => B dB; rewrite -big_distrr /=.
- have [_ /(_ a) -> //] := Dade_Ind_expansion g dB; rewrite !mulrA.
- congr (_ * _); last by apply: eq_bigl => b; rewrite inE dB /= andbC -in_setI.
- rewrite -mulrA mulrCA -!mulrA; congr (_ * _).
- rewrite -invfM mulrCA -invfM -!natrM; congr (_ / _%:R).
- rewrite -(sdprod_card (Dade_set_sdprod dB)) mulnA mulnAC; congr (_ * _)%N.
- by rewrite mulnC Lagrange ?subsetIl.
-rewrite (eq_bigr (fun _ => sumB a)) /= => [|_ /imsetP[x Lx ->]]; last first.
- rewrite {1}/sumB (reindex_inj (@conjsg_inj _ x)) /=.
- symmetry; apply: eq_big => B.
- rewrite ![_ \in P_ _]inE dBJ //.
- by rewrite -{2}(conjGid Lx) normJ -conjIg memJ_conjg.
- case/setIdP=> dB Na; have [sBA _] := setIdP dB.
- have defHBx: 'H(B :^ x) = 'H(B) :^ x.
- rewrite /'H(_) (big_imset _ (in2W (conjg_inj x))) -bigcapJ /=.
- by apply: eq_bigr => b Bb; rewrite DadeJ ?(subsetP sBA).
- rewrite /nn2 /aa2 defHBx !cardJg; congr (_ * _%:R).
- rewrite -(card_rcoset _ x); apply: eq_card => y.
- rewrite !(inE, mem_rcoset, mem_conjg) conjMg conjVg conjgK -conjgM.
- by rewrite groupMr // groupV (subsetP sLG).
-rewrite sumr_const mulrC [sumB a](bigD1 [set a]) /=; last first.
- by rewrite 3!inE cent1id sub1set Aa -cards_eq0 cards1 (subsetP sAL).
-rewrite -[_ *+ _]mulr_natr -mulrA mulrDl -!mulrA ['H(_)]big_set1 cards1.
-have ->: aa2 [set a] a = #|'C_G[a]|%:R.
- have [u x Ha_ux Gx def_g] := imset2P Ha_g.
- rewrite -(card_lcoset _ x^-1); congr _%:R; apply: eq_card => y.
- rewrite ['H(_)]big_set1 mem_lcoset invgK inE def_g -conjgM.
- rewrite -(groupMl y Gx) inE; apply: andb_id2l => Gxy.
- by have [_ _ -> //] := normedTI_memJ_P (Dade_cover_TI Aa); rewrite inE Gxy.
-rewrite mulN1r mulrC mulrA -natrM -(sdprod_card (defCA Aa)).
-rewrite -mulnA card_orbit astab1J Lagrange ?subsetIl // mulnC natrM.
-rewrite mulrAC mulfK ?neq0CG // mulrC divfK ?neq0CG // opprK.
-rewrite (bigID [pred B : {set gT} | a \in B]) /= mulrDl addrA.
-apply: canRL (subrK _) _; rewrite -mulNr -sumrN; congr (_ + _ * _).
-symmetry.
-rewrite (reindex_onto (fun B => a |: B) (fun B => B :\ a)) /=; last first.
- by move=> B; case/andP=> _; apply: setD1K.
-symmetry; apply: eq_big => B.
- rewrite setU11 andbT -!andbA; apply/and3P/and3P; case.
- do 2![case/setIdP] => sBA ntB /setIP[La nBa] _ notBa.
- rewrite 3!inE subUset sub1set Aa sBA La setU1K // -cards_eq0 cardsU1 notBa.
- rewrite -sub1set normsU ?sub1set ?cent1id //= eq_sym eqEcard subsetUl /=.
- by rewrite cards1 cardsU1 notBa ltnS leqn0 cards_eq0.
- do 2![case/setIdP] => /subUsetP[_ sBA] _ /setIP[La].
- rewrite inE conjUg (normP (cent1id a)) => /subUsetP[_ sBa_aB].
- rewrite eq_sym eqEcard subsetUl cards1 (cardsD1 a) setU11 ltnS leqn0 /=.
- rewrite cards_eq0 => notB0 /eqP defB.
- have notBa: a \notin B by rewrite -defB setD11.
- split=> //; last by apply: contraNneq notBa => ->; apply: set11.
- rewrite !inE sBA La -{1 3}defB notB0 subsetD1 sBa_aB.
- by rewrite mem_conjg /(a ^ _) invgK mulgA mulgK.
-do 2![case/andP] => /setIdP[dB Na] _ notBa.
-suffices ->: aa2 B a = #|'H(B) : 'H(a |: B)|%:R * aa2 (a |: B) a.
- rewrite /nn2 cardsU1 notBa exprS mulN1r !mulNr; congr (- _).
- rewrite !mulrA; congr (_ * _); rewrite -!mulrA; congr (_ * _).
- apply: canLR (mulKf (neq0CG _)) _; apply: canRL (mulfK (neq0CG _)) _ => /=.
- by rewrite -natrM mulnC Lagrange //= Dade_setU1 ?subsetIl.
-rewrite /aa2 Dade_setU1 //= -natrM; congr _%:R.
-have defMB := Dade_set_sdprod dB; have [_ mulHNB nHNB tiHNB] := sdprodP defMB.
-have [sHMB sNMB] := mulG_sub mulHNB; have [La nBa] := setIP Na.
-have nHa: a \in 'N('H(B)) by rewrite (subsetP nHNB).
-have Ca: a \in 'C_L[a] by rewrite inE cent1id La.
-have [|/= partHBa nbHBa] := partition_cent_rcoset nHa.
- have [sBA] := setIdP dB; case/set0Pn=> b Bb; have Ab := subsetP sBA b Bb.
- rewrite (coprime_dvdr (order_dvdG Ca)) //= ['H(B)](bigD1 b) //=.
- by rewrite (coprimeSg (subsetIl _ _)) ?coHL.
-pose pHBa := mem ('H(B) :* a).
-rewrite -sum1_card (partition_big (fun x => g ^ x) pHBa) /= => [|x]; last first.
- by case/setIdP=> _ ->.
-rewrite (set_partition_big _ partHBa) /= -nbHBa -sum_nat_const.
-apply: eq_bigr => _ /imsetP[x Hx ->].
-rewrite (big_imset _ (in2W (conjg_inj x))) /=.
-rewrite -(card_rcoset _ x) -sum1_card; symmetry; set HBaa := 'C_(_)[a] :* a.
-rewrite (partition_big (fun y => g ^ (y * x^-1)) (mem HBaa)); last first.
- by move=> y; rewrite mem_rcoset => /setIdP[].
-apply: eq_bigr => /= u Ca_u; apply: eq_bigl => z.
-rewrite -(canF_eq (conjgKV x)) -conjgM; apply: andb_id2r; move/eqP=> def_u.
-have sHBG: 'H(B) \subset G.
- have [sBA /set0Pn[b Bb]] := setIdP dB; have Ab := subsetP sBA b Bb.
- by rewrite (bigcap_min b) ?sHG.
-rewrite mem_rcoset !inE groupMr ?groupV ?(subsetP sHBG x Hx) //=.
-congr (_ && _); have [/eqP defHBa _ _] := and3P partHBa.
-symmetry; rewrite def_u Ca_u -defHBa -(mulgKV x z) conjgM def_u -/HBaa.
-by rewrite cover_imset -class_supportEr mem_imset2.
-Qed.
-
-End DadeExpansion.
-
-(* This is Peterfalvi (2.6)(b) *)
-Lemma Dade_vchar alpha : alpha \in 'Z[irr L, A] -> alpha^\tau \in 'Z[irr G].
-Proof.
-rewrite [alpha \in _]zchar_split => /andP[Zaa CFaa].
-rewrite Dade_expansion // rpredN rpred_sum // => B dB.
-suffices calP_B: B \in calP.
- by rewrite rpredZsign cfInd_vchar // Dade_restriction_vchar.
-case/imsetP: dB => B0 /setIdP[sB0A notB00] defB.
-have [x Lx ->]: exists2 x, x \in L & B = B0 :^ x.
- by apply/imsetP; rewrite defB (mem_repr B0) ?orbit_refl.
-by rewrite inE -cards_eq0 cardJg cards_eq0 -(normsP nAL x Lx) conjSg sB0A.
-Qed.
-
-(* This summarizes Peterfalvi (2.6). *)
-Lemma Dade_Zisometry : {in 'Z[irr L, A], isometry Dade, to 'Z[irr G, G^#]}.
-Proof.
-split; first by apply: sub_in2 Dade_isometry; apply: zchar_on.
-by move=> phi Zphi; rewrite /= zchar_split Dade_vchar ?Dade_cfun.
-Qed.
-
-End Two.
-
-Section RestrDade.
-
-Variables (gT : finGroupType) (G L : {group gT}) (A A1 : {set gT}).
-Hypothesis ddA : Dade_hypothesis G L A.
-Hypotheses (sA1A : A1 \subset A) (nA1L : L \subset 'N(A1)).
-Let ssA1A := subsetP sA1A.
-
-(* This is Peterfalvi (2.11), first part. *)
-Lemma restr_Dade_hyp : Dade_hypothesis G L A1.
-Proof.
-have [/andP[sAL nAL] notA_1 sLG conjAG [H defCa coHL]] := ddA.
-have nsA1L: A1 <| L by rewrite /normal (subset_trans sA1A).
-split; rewrite ?(contra (@ssA1A _)) //; first exact: sub_in2 conjAG.
-by exists H; [apply: sub_in1 defCa | apply: sub_in2 coHL].
-Qed.
-Local Notation ddA1 := restr_Dade_hyp.
-
-Local Notation H dd := (Dade_signalizer dd).
-Lemma restr_Dade_signalizer H1 : {in A, H ddA =1 H1} -> {in A1, H ddA1 =1 H1}.
-Proof.
-move=> defH1; apply: def_Dade_signalizer => a /ssA1A Aa.
-by rewrite -defH1 ?Dade_sdprod.
-Qed.
-
-Lemma restr_Dade_support1 : {in A1, Dade_support1 ddA1 =1 Dade_support1 ddA}.
-Proof.
-by move=> a A1a; rewrite /Dade_support1 (@restr_Dade_signalizer (H ddA)).
-Qed.
-
-Lemma restr_Dade_support :
- Dade_support ddA1 = \bigcup_(a in A1) Dade_support1 ddA a.
-Proof. by rewrite -(eq_bigr _ restr_Dade_support1). Qed.
-
-Definition restr_Dade := Dade ddA1.
-
-(* This is Peterfalvi (2.11), second part. *)
-Lemma restr_DadeE : {in 'CF(L, A1), restr_Dade =1 Dade ddA}.
-Proof.
-move=> aa CF1aa; apply/cfunP=> g; rewrite cfunElock.
-have CFaa: aa \in 'CF(L, A) := cfun_onS sA1A CF1aa.
-have [a /= /andP[A1a Ha_g] | no_a /=] := pickP.
- by apply/esym/DadeE; rewrite -1?restr_Dade_support1 ?ssA1A.
-rewrite cfunElock; case: pickP => //= a /andP[_ Ha_g].
-rewrite (cfun_on0 CF1aa) //; apply: contraFN (no_a a) => A1a.
-by rewrite A1a restr_Dade_support1.
-Qed.
-
-End RestrDade.
-
-Section NormedTI.
-
-Variables (gT : finGroupType) (G L : {group gT}) (A : {set gT}).
-Hypotheses (tiAG : normedTI A G L) (sAG1 : A \subset G^#).
-
-(* This is the existence part of Peterfalvi (2.3). *)
-Lemma normedTI_Dade : Dade_hypothesis G L A.
-Proof.
-have [[sAG notA1] [_ _ /eqP defL]] := (subsetD1P sAG1, and3P tiAG).
-have [_ sLG tiAG_L] := normedTI_memJ_P tiAG.
-split=> // [|a b Aa Ab /imsetP[x Gx def_b]|].
-- rewrite /(A <| L) -{2}defL subsetIr andbT; apply/subsetP=> a Aa.
- by rewrite -(tiAG_L a) ?(subsetP sAG) // conjgE mulKg.
-- by rewrite def_b mem_imset // -(tiAG_L a) -?def_b.
-exists (fun _ => 1%G) => [a Aa | a b _ _]; last by rewrite cards1 coprime1n.
-by rewrite sdprod1g -(setIidPl sLG) -setIA (setIidPr (cent1_normedTI tiAG Aa)).
-Qed.
-
-Let def_ddA := Dade_Ind normedTI_Dade tiAG.
-
-(* This is the identity part of Isaacs, Lemma 7.7. *)
-Lemma normedTI_Ind_id1 :
- {in 'CF(L, A) & 1%g |: A, forall alpha, 'Ind[G] alpha =1 alpha}.
-Proof. by move=> aa a CFaa A1a; rewrite /= -def_ddA // Dade_id1. Qed.
-
-(* A more restricted, but more useful form. *)
-Lemma normedTI_Ind_id :
- {in 'CF(L, A) & A, forall alpha, 'Ind[G] alpha =1 alpha}.
-Proof. by apply: sub_in11 normedTI_Ind_id1 => //; apply/subsetP/subsetUr. Qed.
-
-(* This is the isometry part of Isaacs, Lemma 7.7. *)
-(* The statement in Isaacs is slightly more general in that it allows for *)
-(* beta \in 'CF(L, 1%g |: A); this appears to be more cumbersome than useful. *)
-Lemma normedTI_isometry : {in 'CF(L, A) &, isometry 'Ind[G]}.
-Proof. by move=> aa bb CFaa CFbb; rewrite /= -!def_ddA // Dade_isometry. Qed.
-
-End NormedTI. \ No newline at end of file