aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/odd_order/PFsection7.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/PFsection7.v
parentc1ec9cd8e7e50f73159613c492aad4c6c40bc3aa (diff)
move odd_order to its own repository
Diffstat (limited to 'mathcomp/odd_order/PFsection7.v')
-rw-r--r--mathcomp/odd_order/PFsection7.v828
1 files changed, 0 insertions, 828 deletions
diff --git a/mathcomp/odd_order/PFsection7.v b/mathcomp/odd_order/PFsection7.v
deleted file mode 100644
index 559ed7c..0000000
--- a/mathcomp/odd_order/PFsection7.v
+++ /dev/null
@@ -1,828 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg poly finset center.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action zmodp.
-From mathcomp
-Require Import gfunctor gproduct cyclic pgroup commutator nilpotent frobenius.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation BGsection3 vector.
-From mathcomp
-Require Import ssrnum algC classfun character inertia vcharacter.
-From mathcomp
-Require Import PFsection1 PFsection2 PFsection4 PFsection5 PFsection6.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 7: *)
-(* Non-existence of a Certain Type of Group of Odd Order *)
-(* Defined here: *)
-(* inDade ddA == the right inverse to the Dade isometry with respect to G, *)
-(* L, A, given ddA : Dade_hypothesis G L A. *)
-(* phi^\rho == locally-bindable Notation for invDade ddA phi. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory Num.Theory.
-Local Open Scope ring_scope.
-
-Reserved Notation "alpha ^\rho" (at level 2, format "alpha ^\rho").
-
-Section Seven.
-
-Variables (gT : finGroupType) (G : {group gT}).
-Implicit Types (L H P : {group gT}) (DH : gT -> {group gT}).
-
-(* Properties of the inverse to the Dade isometry (Peterfalvi (7.1) to (7.3). *)
-Section InverseDade.
-
-Variables (A : {set gT}) (L : {group gT}).
-Hypothesis ddA : Dade_hypothesis G L A.
-
-Local Notation "alpha ^\tau" := (Dade ddA alpha).
-Local Notation Atau := (Dade_support ddA).
-Local Notation H := (Dade_signalizer ddA).
-
-Let nsAL : A <| L. Proof. by have [] := ddA. Qed.
-Let sAL : A \subset L. Proof. exact: normal_sub nsAL. Qed.
-Let nAL : L \subset 'N(A). Proof. exact: normal_norm nsAL. Qed.
-Let sLG : L \subset G. Proof. by have [] := ddA. Qed.
-
-(* This is the Definition embedded in Peterfalvi, Hypothesis (7.1). *)
-Fact invDade_subproof (chi : 'CF(G)) :
- is_class_fun <<L>>
- [ffun a => #|H a|%:R^-1 * (\sum_(x in H a) chi (x * a)%g) *+ (a \in A)].
-Proof.
-rewrite genGid; apply: intro_class_fun => [x y Lx Ly | x notLx]; last first.
- by rewrite (contraNF (subsetP sAL x)).
-rewrite memJ_norm ?(subsetP nAL) // !mulrb; case: ifP => // Ax.
-rewrite (DadeJ ddA) // cardJg; congr (_ * _).
-rewrite big_imset /= => [|z y0 _ _ /=]; last exact: conjg_inj.
-by apply: eq_bigr => u Hu; rewrite -conjMg cfunJ // (subsetP sLG).
-Qed.
-Definition invDade alpha := Cfun 1 (invDade_subproof alpha).
-
-Local Notation "alpha ^\rho" := (invDade alpha).
-
-Fact invDade_is_linear : linear invDade.
-Proof.
-move=> mu alpha beta; apply/cfunP=> a; rewrite !cfunElock.
-rewrite mulrnAr -mulrnDl mulrCA -mulrDr; congr (_ * _ *+ _).
-by rewrite big_distrr -big_split; apply: eq_bigr => x _; rewrite !cfunE.
-Qed.
-Canonical invDade_linear := Linear invDade_is_linear.
-Canonical invDade_additive := Additive invDade_is_linear.
-
-Lemma invDade_on chi : chi^\rho \in 'CF(L, A).
-Proof. by apply/cfun_onP=> x notAx; rewrite cfunElock (negPf notAx). Qed.
-
-Lemma invDade_cfun1 : 1^\rho = '1_A.
-Proof.
-apply/cfunP=> x; rewrite cfuniE // cfunElock mulrb; case: ifP => //= Ax.
-apply: canLR (mulKf (neq0CG _)) _; rewrite mulr1 -sumr_const.
-apply: eq_bigr => u Hu; rewrite cfun1E (subsetP (subsetIl G 'C[x])) //.
-have /sdprodP[_ <- _ _] := Dade_sdprod ddA Ax.
-by rewrite mem_mulg // inE cent1id (subsetP sAL).
-Qed.
-
-(* This is Peterfalvi (2.7), restated using invDade. *)
-Lemma invDade_reciprocity chi alpha :
- alpha \in 'CF(L, A) -> '[alpha^\tau, chi] = '[alpha, chi^\rho].
-Proof.
-move=> Aalpha; apply: general_Dade_reciprocity => //= a Aa.
-by rewrite cfunElock Aa.
-Qed.
-
-(* This is Peterfalvi (7.2)(a). *)
-Lemma DadeK alpha : alpha \in 'CF(L, A) -> (alpha^\tau)^\rho = alpha.
-Proof.
-move=> Aalpha; apply/cfunP=> a; rewrite cfunElock mulrb.
-case: ifPn => [Aa | /cfun_on0-> //]; apply: canLR (mulKf (neq0CG _)) _.
-rewrite mulr_natl -sumr_const; apply: eq_bigr => x Hx.
-by rewrite (DadeE _ Aa) ?mem_class_support // mem_mulg ?set11.
-Qed.
-
-(* This is Peterfalvi (7.2)(b); note that by (7.2)(a) chi is in the image of *)
-(* tau iff chi = (chi^\rho)^\tau, and this condition is easier to write. *)
-Lemma leC_norm_invDade chi :
- '[chi^\rho] <= '[chi] ?= iff (chi == (chi^\rho)^\tau).
-Proof.
-have Achi_rho := invDade_on chi; rewrite -(Dade_isometry ddA) //.
-set chi1 := _^\tau; rewrite -subr_eq0 -cfnorm_eq0; set mu := chi - chi1.
-have owv: '[chi1, mu] = 0.
- by rewrite invDade_reciprocity ?raddfB //= DadeK ?subrr.
-rewrite -(subrK chi1 chi) -/mu addrC cfnormD owv conjC0 !addr0.
-split; first by rewrite -subr_ge0 addrC addKr cfnorm_ge0.
-by rewrite eq_sym addrC -subr_eq0 addrK.
-Qed.
-
-(* This is Peterfalvi (7.3). *)
-Lemma leC_cfnorm_invDade_support chi :
- '[chi^\rho] <= #|G|%:R^-1 * (\sum_(g in Atau) `|chi g| ^+ 2)
- ?= iff [forall a in A, forall u in H a, chi (u * a)%g == chi a].
-Proof.
-have nsAtauG: Atau <| G := Dade_support_normal ddA.
-pose chi1 := chi * '1_Atau; set RHS := _ * _.
-have inA1 a x: a \in A -> x \in H a -> (x * a)%g \in Dade_support1 ddA a.
- by move=> Aa Hx; rewrite mem_class_support ?mem_mulg ?set11.
-have chi1E a x: a \in A -> x \in H a -> chi1 (x * a)%g = chi (x * a)%g.
- move=> Aa Hx; rewrite cfunE cfuniE // mulr_natr mulrb.
- by case: bigcupP => // [[]]; exists a; rewrite ?inA1.
-have ->: chi^\rho = chi1^\rho.
- apply/cfunP => a; rewrite !cfunElock !mulrb; case: ifP => // Aa.
- by congr (_ * _); apply: eq_bigr => x /chi1E->.
-have Achi1: chi1 \in 'CF(G, Atau).
- by apply/cfun_onP=> x ?; rewrite cfunE (cfun_onP (cfuni_on _ _)) ?mulr0.
-have{Achi1 RHS} <-: '[chi1] = RHS.
- rewrite (cfnormE Achi1); congr (_ * _).
- by apply: eq_bigr => x Atau_x; rewrite cfunE cfuniE // Atau_x mulr1.
-congr (_ <= _ ?= iff _): (leC_norm_invDade chi1).
-apply/eqP/forall_inP=> [chi1_id a Aa | chi_id].
- apply/forall_inP => x Ha_x; rewrite -{2}[a]mul1g -!chi1E // chi1_id mul1g.
- by rewrite (DadeE _ Aa) ?inA1 ?Dade_id.
-apply/cfunP => g; rewrite cfunE cfuniE // mulr_natr mulrb.
-case: ifPn => [/bigcupP[a Aa] | /(cfun_onP (Dade_cfunS _ _))-> //].
-case/imset2P=> _ z /rcosetP[x Hx ->] Gz ->{g}; rewrite !cfunJ {z Gz}//.
-have{chi_id} chi_id := eqP (forall_inP (chi_id a Aa) _ _).
-rewrite chi_id // (DadeE _ Aa) ?inA1 {x Hx}// cfunElock mulrb Aa.
-apply: canRL (mulKf (neq0CG _)) _; rewrite mulr_natl -sumr_const.
-by apply: eq_bigr => x Hx; rewrite chi1E ?chi_id.
-Qed.
-
-(* This is the norm expansion embedded in Peterfalvi (7.3). *)
-Lemma cfnormE_invDade chi :
- '[chi^\rho] = #|L|%:R^-1 * (\sum_(a in A) `|chi^\rho a| ^+ 2).
-Proof. by apply: cfnormE; apply: invDade_on. Qed.
-
-End InverseDade.
-
-(* Hypothesis (7.4) and Lemma (7.5). *)
-Section DadeCoverInequality.
-
-(* These declarations correspond to Peterfalvi, Hypothesis (7.4); as it is *)
-(* only instantiated twice after this section we leave it unbundled. *)
-Variables (I : finType) (L : I -> {group gT}) (A : I -> {set gT}).
-Hypothesis ddA : forall i : I, Dade_hypothesis G (L i) (A i).
-
-Local Notation Atau i := (Dade_support (ddA i)).
-Local Notation "alpha ^\rho" := (invDade (ddA _) alpha).
-Hypothesis disjointA : forall i j, i != j -> [disjoint Atau i & Atau j].
-
-(* This is Peterfalvi (7.5), generalised to all class functions of norm 1. *)
-Lemma Dade_cover_inequality (chi : 'CF(G)) (G0 := G :\: \bigcup_i Atau i) :
- '[chi] = 1 ->
- #|G|%:R^-1 * (\sum_(g in G0) `|chi g| ^+ 2 - #|G0|%:R)
- + \sum_i ('[chi^\rho]_(L i) - #|A i|%:R / #|L i|%:R) <= 0.
-Proof.
-move=> Nchi1; set vG := _^-1; rewrite sumrB /= addrCA mulrBr -addrA.
-pose F (xi : 'CF(G)) (B : {set gT}) := vG * \sum_(g in B) `|xi g| ^+ 2.
-have sumF xi: F xi G0 + \sum_i F xi (Atau i) = '[xi].
- rewrite (cfnormE (cfun_onG _)) -mulr_sumr -mulrDr; congr (_ * _).
- rewrite -partition_disjoint_bigcup //=; set U_A := \bigcup_i _.
- have sUG: U_A \subset G by apply/bigcupsP=> i _; apply: Dade_support_sub.
- by rewrite -(setIidPr sUG) addrC -big_setID.
-have ->: \sum_i #|A i|%:R / #|L i|%:R = \sum_i F 1 (Atau i).
- apply: eq_bigr => i _; apply/eqP; rewrite /F.
- have [[/andP[sAL nAL] _ _ _ _] sHG] := (ddA i, Dade_signalizer_sub (ddA i)).
- rewrite -{1}[A i]setIid -cfdot_cfuni /normal ?sAL // -(invDade_cfun1 (ddA i)).
- rewrite leC_cfnorm_invDade_support; apply/forall_inP=> a Aa.
- by apply/forall_inP=> x Hx; rewrite !cfun1E groupMl // (subsetP (sHG a)).
-have ->: vG * #|G0|%:R = F 1 G0.
- congr (_ * _); rewrite -sumr_const; apply: eq_bigr => x /setDP[Gx _].
- by rewrite cfun1E Gx normr1 expr1n.
-rewrite -opprD sumF cfnorm1 -Nchi1 -sumF opprD addNKr -oppr_ge0 opprB -sumrB.
-by rewrite sumr_ge0 // => i _; rewrite subr_ge0 leC_cfnorm_invDade_support.
-Qed.
-
-(*
-set vG := _^-1; rewrite sumrB /= addrCA mulrBr -addrA.
-pose F t (B : {set gT}) := vG * \sum_(g in B) `|'chi[G]_t g| ^+ 2.
-have sumF t: F t G0 + \sum_i F t (Atau i) = 1.
- rewrite -(cfnorm_irr t) (cfnormE (cfun_onG _)) -mulr_sumr -mulrDr.
- congr (_ * _); rewrite -partition_disjoint_bigcup //=; set U_A := \bigcup_i _.
- have sUG: U_A \subset G by apply/bigcupsP=> i _; apply: Dade_support_sub.
- by rewrite -(setIidPr sUG) addrC -big_setID.
-have ->: \sum_i #|A i|%:R / #|L i|%:R = \sum_i F 0 (Atau i).
- apply: eq_bigr => i _; apply/eqP; rewrite /F irr0.
- have [[/andP[sAL nAL] _ _ _ _] sHG] := (ddA i, Dade_signalizer_sub (ddA i)).
- rewrite -{1}[A i]setIid -cfdot_cfuni /normal ?sAL // -(invDade_cfun1 (ddA i)).
- rewrite leC_cfnorm_invDade_support; apply/forall_inP=> a Aa.
- by apply/forall_inP=> x Hx; rewrite !cfun1E groupMl // (subsetP (sHG a)).
-have ->: vG * #|G0|%:R = F 0 G0.
- congr (_ * _); rewrite -sumr_const; apply: eq_bigr => x /setDP[Gx _].
- by rewrite irr0 cfun1E Gx normr1 expr1n.
-rewrite -opprD sumF -(sumF r) opprD addNKr -oppr_ge0 opprB -sumrB.
-by rewrite sumr_ge0 // => i _; rewrite subr_ge0 leC_cfnorm_invDade_support.
-Qed.
-*)
-
-End DadeCoverInequality.
-
-(* Hypothesis (7.6), and Lemmas (7.7) and (7.8) *)
-Section Dade_seqIndC1.
-
-(* In this section, A = H^# with H <| L. *)
-Variables L H : {group gT}.
-Let A := H^#.
-Hypothesis ddA : Dade_hypothesis G L A.
-
-Local Notation Atau := (Dade_support ddA).
-Local Notation "alpha ^\tau" := (Dade ddA alpha).
-Local Notation "alpha ^\rho" := (invDade ddA alpha).
-
-Let calT := seqIndT H L.
-Local Notation calS := (seqIndD H L H 1).
-Local Notation Ind1H := ('Ind[gval L, gval H] 1).
-Let uniqS : uniq calS := seqInd_uniq _ _.
-
-Let h := #|H|%:R : algC.
-Let e := #|L : H|%:R : algC.
-
-Let nsAL : A <| L. Proof. by have [] := ddA. Qed.
-Let sLG : L \subset G. Proof. by have [] := ddA. Qed.
-Let nsHL : H <| L. Proof. by rewrite -normalD1. Qed.
-Let sHL := normal_sub nsHL.
-Let nHL := normal_norm nsHL.
-
-Let nzh : h != 0 := neq0CG H.
-Let nze : e != 0 := neq0CiG L H.
-Let nzL : #|L|%:R != 0 := neq0CG L.
-
-Let eh : e * h = #|L|%:R. Proof. by rewrite -natrM mulnC Lagrange. Qed.
-
-Section InvDadeSeqInd.
-
-Variables (xi0 : 'CF(L)) (S : seq 'CF(L)) (chi : 'CF(G)).
-Implicit Types xi mu : 'CF(L).
-
-Let d xi := xi 1%g / xi0 1%g.
-Let psi xi := xi - d xi *: xi0.
-Let c xi := '[(psi xi)^\tau, chi].
-
-Let uc c xi mu := (c xi)^* * c mu / ('[xi] * '[mu]).
-Let u c xi mu := uc c xi mu * ('[xi, mu] - xi 1%g * mu 1%g / (e * h)).
-
-(* This is Peterfalvi (7.7); it is stated using a bespoke concrete Prop so as *)
-(* to encapsulate the coefficient definitions given above. *)
-CoInductive is_invDade_seqInd_sum : Prop :=
- InvDadeSeqIndSum (c := c) (u := u c) of
- (*a*) {in A, forall x, (chi^\rho) x = \sum_(xi <- S) (c xi)^* / '[xi] * xi x}
- & (*b*) '[chi^\rho] = \sum_(xi <- S) \sum_(mu <- S) u xi mu.
-
-Lemma invDade_seqInd_sum : perm_eq calT (xi0 :: S) -> is_invDade_seqInd_sum.
-Proof.
-move=> defT; pose chi0 := \sum_(xi <- S) (c xi)^* / '[xi] *: xi.
-have Txi0: xi0 \in calT by rewrite (perm_eq_mem defT) mem_head.
-have sST : {subset S <= calT}.
- by move=> xi Sxi; rewrite (perm_eq_mem defT) mem_behead.
-have nz_xi01 : xi0 1%g != 0 by apply: seqInd1_neq0 Txi0.
-have part_a: {in A, chi^\rho =1 chi0}.
- pose phi := (chi^\rho - chi0) * '1_A.
- have Aphi : phi \in 'CF(L, A) := mul_cfuni_on A _.
- suffices: '[phi, chi^\rho - chi0] == 0; last clearbody phi.
- rewrite -(eq_cfdotr Aphi (eq_mul_cfuni _ nsAL)) cfnorm_eq0 => /eqP phi0.
- by move=> x Ax; rewrite -[chi0]add0r -phi0 cfunE eq_mul_cfuni ?cfunE ?subrK.
- have{Aphi} [Hphi phi1]: phi \in 'CF(L, H) /\ phi 1%g = 0.
- by move: Aphi; rewrite cfun_onD1 => /andP[-> /eqP].
- have{Hphi} def_phi: phi = e^-1 *: 'Ind ('Res[H] phi).
- apply/cfunP=> y; have [Hy | notHy] := boolP (y \in H); last first.
- by rewrite cfunE !(cfun_on0 _ notHy) ?mulr0 ?cfInd_normal.
- rewrite cfunE cfIndE // mulrA -invfM eh.
- apply: (canRL (mulKf nzL)); rewrite mulr_natl -sumr_const.
- by apply: eq_bigr => z Lz; rewrite cfResE ?memJ_norm ?cfunJ ?(subsetP nHL).
- have{def_phi} Tphi: phi \in <<calT>>%VS.
- rewrite def_phi memvZ // ['Res _]cfun_sum_cfdot linear_sum.
- apply: memv_suml => i _; rewrite linearZ memvZ ?memv_span //=.
- by apply/seqIndP; exists i; rewrite ?inE.
- have{Tphi} [z def_phi _] := free_span (seqInd_free nsHL _) Tphi.
- have {phi def_phi phi1} ->: phi = \sum_(xi <- S) z xi *: psi xi.
- rewrite def_phi (eq_big_perm _ defT) !big_cons /= 2!cfunE in phi1 *.
- rewrite (canRL (mulfK nz_xi01) (canRL (addrK _) phi1)) add0r addrC mulNr.
- rewrite sum_cfunE mulr_suml scaleNr scaler_suml -sumrB.
- by apply: eq_bigr => xi _; rewrite cfunE -mulrA -scalerA -scalerBr.
- rewrite cfdot_suml big1_seq //= => xi Sxi; have Txi := sST xi Sxi.
- rewrite cfdotZl cfdotBr -invDade_reciprocity -/(c xi); last first.
- rewrite cfun_onD1 !cfunE divfK // subrr eqxx andbT.
- by rewrite memvB ?memvZ //= ((seqInd_on _) setT).
- have [oSS /orthoPl o_xi0S]: pairwise_orthogonal S /\ orthogonal xi0 S.
- have:= seqInd_orthogonal nsHL setT; rewrite (eq_pairwise_orthogonal defT).
- by rewrite /= -cat1s pairwise_orthogonal_cat => /and3P[].
- rewrite cfdotBl cfdotC cfproj_sum_orthogonal {oSS}// cfdotZl cfdot_sumr.
- rewrite big1_seq ?mulr0 => [|mu Smu]; last by rewrite cfdotZr o_xi0S ?mulr0.
- by rewrite subr0 divfK ?(cfnorm_seqInd_neq0 _ Txi) // conjCK subrr mulr0.
-split=> [x /part_a-> | ].
- by rewrite sum_cfunE; apply: eq_bigr => ?; rewrite cfunE.
-rewrite (cfdotEl _ (invDade_on ddA _)) mulrC mulr_suml.
-pose F xi mu x := uc c xi mu * (xi x * (mu x)^*) / #|L|%:R.
-transitivity (\sum_(x in A) \sum_(xi <- S) \sum_(mu <- S) F xi mu x).
- apply: eq_bigr => x Ax; rewrite part_a // sum_cfunE -mulrA mulr_suml.
- apply: eq_bigr => xi _; rewrite mulrA -mulr_suml rmorph_sum; congr (_ * _).
- rewrite mulr_sumr; apply: eq_bigr => mu _; rewrite !cfunE (cfdotC mu).
- rewrite -{1}[mu x]conjCK -fmorph_div -rmorphM conjCK -3!mulrA 2!(mulrCA _^-1).
- by rewrite (mulrA _^-1) -invfM 2!(mulrCA (xi x)) mulrA 2!(mulrA _^*).
-rewrite exchange_big; apply: eq_bigr => xi _; rewrite exchange_big /=.
-apply: eq_big_seq => mu Smu; have Tmu := sST mu Smu.
-rewrite /u eh (cfdotEr _ (seqInd_on nsHL Tmu)) (mulrC _^-1) -mulrBl mulrA.
-rewrite -mulr_suml -mulr_sumr (big_setD1 1%g (group1 H)) /=; congr (_ * _ * _).
-by rewrite addrC conj_Cnat ?addKr // (Cnat_seqInd1 Tmu).
-Qed.
-
-End InvDadeSeqInd.
-
-Notation "1" := (1 : 'CF(_)) : classfun_scope.
-
-(* This is Peterfalvi (7.8). *)
-(* Our version is slightly stronger because we state the nontriviality of S *)
-(* directly than through the coherence premise (see the discussion of (5.2)). *)
-Lemma Dade_Ind1_sub_lin (nu : {additive 'CF(L) -> 'CF(G)}) zeta :
- coherent_with calS L^# (Dade ddA) nu -> (1 < size calS)%N ->
- zeta \in irr L -> zeta \in calS -> zeta 1%g = e ->
- let beta := (Ind1H - zeta)^\tau in let calSnu := map nu calS in
- let sumSnu := \sum_(xi <- calS) xi 1%g / e / '[xi] *: nu xi in
- [/\ (*a1*) [/\ orthogonal calSnu 1%CF, '[beta, 1] = 1 & beta \in 'Z[irr G]],
- exists2 Gamma : 'CF(G),
- (*a2*) [/\ orthogonal calSnu Gamma, '[Gamma, 1] = 0
- & exists2 a, a \in Cint & beta = 1 - nu zeta + a *: sumSnu + Gamma]
- & (*b*) e <= (h - 1) / 2%:R ->
- '[(nu zeta)^\rho] >= 1 - e / h /\ '[Gamma] <= e - 1
- & (*c*) {in irr G, forall chi : 'CF(G), orthogonal calSnu chi ->
- [/\ {in A, forall x, chi^\rho x = '[beta, chi]}
- & '[chi^\rho] = #|A|%:R / #|L|%:R * '[beta, chi] ^+ 2]}].
-Proof.
-move=> [[Inu Znu] nu_tau] nt_calS /irrWnorm Nzeta1 Szeta zeta1.
-set mu := _ - _ => beta calSnu sumSnu; pose S1 := rem zeta calS.
-have defS: perm_eq calS (zeta :: S1) := perm_to_rem Szeta.
-have defZS: 'Z[calS, L^#] =i 'Z[calS, A] by apply: zcharD1_seqInd.
-have S1P xi: xi \in S1 -> xi != zeta /\ xi \in calS.
- by rewrite mem_rem_uniq // => /andP[].
-have defT: perm_eql calT [:: Ind1H, zeta & S1].
- apply/perm_eqlP; have Tind1: Ind1H \in calT := seqIndT_Ind1 H L.
- by rewrite (perm_eqlP (perm_to_rem Tind1)) perm_cons -seqIndC1_rem.
-have mu_vchar: mu \in 'Z[irr L, A] := cfInd1_sub_lin_vchar nsHL Szeta zeta1.
-have beta_vchar: beta \in 'Z[irr G] by apply: Dade_vchar.
-have [mu_on beta_on] := (zchar_on mu_vchar, zchar_on beta_vchar).
-have{nt_calS} ntS1: (size S1 > 0)%N by rewrite size_rem // -subn1 subn_gt0.
-case defS1: S1 ntS1 => // [phi S2] _.
-have /S1P[neq_phi Sphi]: phi \in S1 by rewrite defS1 mem_head.
-have nz_phi1: phi 1%g != 0 by rewrite (seqInd1_neq0 nsHL Sphi).
-have NatS1e xi (Sxi : xi \in calS) := dvd_index_seqInd1 nsHL Sxi.
-have oS1: {in calS, forall psi, '[psi, 1] = 0} by apply: seqInd_ortho_1.
-have oS1H: {in calS, forall psi, '[psi, Ind1H] = 0} by apply: seqInd_ortho_Ind1.
-have InuS: {in calS &, isometry nu} by apply: sub_in2 Inu; apply: seqInd_zcharW.
-have ZnuS xi (Sxi : xi \in calS) := Znu xi (seqInd_zcharW Sxi).
-have S_Se xi (Sxi : xi \in calS) := seqInd_sub_lin_vchar nsHL Szeta zeta1 Sxi.
-have oSnu1: orthogonal calSnu 1%CF.
- have dotSnu1 psi : psi \in calS -> '[nu psi, 1] = psi 1%g / e * '[nu zeta, 1].
- move=> Spsi; apply/eqP; rewrite -subr_eq0 -cfdotZl -cfdotBl.
- rewrite -raddfZ_Cnat ?NatS1e // -raddfB; have Spi := S_Se _ Spsi.
- rewrite nu_tau ?defZS // invDade_reciprocity ?(zchar_on Spi) //.
- rewrite invDade_cfun1 (eq_cfdotr (zchar_on Spi) (eq_cfuni nsAL)).
- by rewrite cfdotBl cfdotZl !oS1 // mulr0 subr0.
- suffices oz1: '[nu zeta, 1] = 0.
- by apply/orthoPr=> _ /mapP[psi Spsi ->]; rewrite dotSnu1 // oz1 mulr0.
- have norm_nu_zeta : '[nu zeta] = 1 by rewrite InuS // irrWnorm.
- have [et [t defz]] := vchar_norm1P (ZnuS _ Szeta) norm_nu_zeta.
- rewrite defz cfdotZl -{1}irr0 cfdot_irr mulr_natr mulrb; case: eqP => // t0.
- have /eqP/idPn[] := seqInd_ortho nsHL Sphi Szeta neq_phi.
- rewrite -InuS // defz t0 cfdotZr irr0 dotSnu1 // mulrCA -irr0 -t0.
- by rewrite -cfdotZr -defz norm_nu_zeta mulr1 mulf_neq0 ?invr_eq0.
-have dot_beta_1: '[beta, 1] = 1.
- rewrite invDade_reciprocity // invDade_cfun1 (eq_cfdotr _ (eq_cfuni nsAL)) //.
- by rewrite cfdotBl -Frobenius_reciprocity cfRes_cfun1 ?cfnorm1 ?oS1 ?subr0.
-have o_beta1: '[beta - 1, 1] = 0 by rewrite cfdotBl dot_beta_1 cfnorm1 subrr.
-have [X SnuX [Gamma [def_beta1 _ oSnuG]]]:= orthogonal_split calSnu (beta - 1).
-have oG1: '[Gamma, 1] = 0.
- rewrite -(addKr X Gamma) -def_beta1 addrC cfdotBl o_beta1.
- by rewrite (span_orthogonal oSnu1) ?subr0 // memv_span ?mem_head.
-have oSS: pairwise_orthogonal calS by apply: seqInd_orthogonal.
-have oSnuS: pairwise_orthogonal calSnu by apply: map_pairwise_orthogonal.
-have [a_ def_a defX] := orthogonal_span oSnuS SnuX.
-have{def_a} def_a: {in calS, forall xi, a_ (nu xi) = '[beta, nu xi] / '[xi]}.
- move=> xi Sxi; rewrite (canRL (subrK 1) def_beta1) !cfdotDl def_a InuS //.
- by rewrite (cfdotC 1) (orthoPl oSnuG) ?(orthoPr oSnu1) ?map_f ?conjC0 ?addr0.
-pose a := '[beta, nu zeta] + 1; have Z1 := Cint1.
-have{Z1} Za: a \in Cint by rewrite rpredD ?Cint_cfdot_vchar // ZnuS.
-have {a_ def_a defX} defX: X = - nu zeta + a *: sumSnu.
- rewrite linear_sum defX big_map !(eq_big_perm _ defS) !big_cons /= addrCA.
- rewrite def_a // Nzeta1 !divr1 zeta1 divff // scalerDl !scale1r addrA.
- rewrite addrK; congr (_ + _); apply: eq_big_seq => xi /S1P[neq_xi Sxi].
- rewrite def_a // scalerA mulrA mulrDl mul1r; congr (_ / _ *: _).
- rewrite mulrC -(conj_Cnat (NatS1e _ Sxi)) -cfdotZr -raddfZ_Cnat ?NatS1e //.
- rewrite addrC; apply: canRL (subrK _) _; rewrite -!raddfB /= -/e.
- have Spi := S_Se xi Sxi; rewrite nu_tau ?defZS //.
- rewrite Dade_isometry ?(zchar_on Spi) // cfdotC cfdotBl cfdotZl !cfdotBr.
- by rewrite !oS1H ?(seqInd_ortho _ Sxi) // Nzeta1 subr0 !add0r mulrN1 opprK.
-have Ind1H1: Ind1H 1%g = e by rewrite cfInd1 // cfun11 mulr1.
-split=> // [ | chi /irrP[t def_chi] o_chiSnu].
- rewrite (canRL (subrK 1) def_beta1) defX addrC 2!addrA.
- exists Gamma; first by rewrite orthogonal_sym; split; last exists a.
- move=> lt_e_h2; pose v := h^-1; pose u := e^-1 * (1 - v); set w := 1 - e / h.
- have hu: h * u = e^-1 * (h - 1) by rewrite mulrCA (mulrBr h) mulr1 divff.
- have ->: '[(nu zeta)^\rho] = u * a ^+ 2 - v * a *+ 2 + w.
- have defT1: perm_eq calT [:: phi, Ind1H, zeta & S2].
- by rewrite defT defS1 (perm_catCA [:: _; _] phi).
- have [c ua _ ->] := invDade_seqInd_sum (nu zeta) defT1.
- have def_c xi: xi \in calS -> c xi = '[xi, zeta].
- move=> S2xi; rewrite /c mulrC -{1}[xi]scale1r -(mulVf nz_phi1) -!scalerA.
- rewrite -scalerBr linearZ cfdotZl /=; set pi := _ - _.
- have Spi: pi \in 'Z[calS, A] by apply: sub_seqInd_zchar.
- rewrite -nu_tau ?defZS // Inu ?(zcharW Spi) ?seqInd_zcharW //.
- by rewrite cfdotBl !cfdotZl (seqInd_ortho _ Sphi) // mulr0 subr0 mulKf.
- have c2: c zeta = 1 by rewrite def_c.
- have c1: c Ind1H = a.
- by rewrite /a -c2 -cfdotDl -linearD !addrA subrK zeta1 -Ind1H1.
- have{def_c} c3 xi: xi \in S2 -> c xi = 0.
- move=> S2xi; have /S1P[neq_xi Sxi]: xi \in S1 by rewrite defS1 mem_behead.
- by rewrite def_c // (seqInd_ortho _ Sxi).
- rewrite !big_cons; have kill0 := (mul0r, mulr0, big1, conjC0).
- rewrite !big1_seq /ua; try by move=> psi /c3->; do 2?rewrite ?kill0 => *.
- rewrite !addr0 c1 c2 Nzeta1 cfnorm_Ind_cfun1 // -/e Ind1H1 zeta1 conjC1.
- rewrite cfdotC (seqInd_ortho_Ind1 _ _ Szeta) // !kill0 sub0r !mulrN !mulr1.
- rewrite divr1 !mul1r !invfM mulrBr !mulrA !mulfK ?divfK // -/w.
- rewrite aut_Cint // -[_ / h]mulrA -{1}[e^-1]mulr1 -2!mulrBr -/u -/v.
- by rewrite mulrC mulrA addrA (mulrC v) -[_ - _]addrA -opprD.
- have ->: '[Gamma] = e - 1 - h * (u * a ^+ 2 - v * a *+ 2).
- have /(canLR (addrK 1)) <-: '[beta] = e + 1.
- rewrite Dade_isometry // cfnormBd ?cfnorm_Ind_cfun1 ?Nzeta1 //.
- by rewrite cfdotC (seqInd_ortho_Ind1 _ _ Szeta) ?conjC0.
- rewrite -[beta](subrK 1) cfnormDd; last first.
- by rewrite cfdotBl dot_beta_1 cfnorm1 subrr.
- rewrite cfnorm1 addrK def_beta1 (addrC X) cfnormDd; last first.
- by rewrite (span_orthogonal oSnuG) // memv_span ?mem_head.
- do 2!apply: canRL (addrK _) _; rewrite -addrA; congr (_ + _).
- rewrite defX (addrC (- nu _)) cfnormB cfnormZ Cint_normK // InuS //.
- rewrite cfdotZl cfproj_sum_orthogonal // Nzeta1 zeta1 divff // divr1.
- rewrite !mulr1 aut_Cint // mulrBr mulrDr mulVKf // addrAC.
- rewrite mulrA mulrC hu -[e^-1](divfK nze) -expr2; congr (_ * _ - _ + 1).
- rewrite -mulrA -sum_seqIndC1_square // mulr_sumr cfnorm_sum_orthogonal //.
- apply: eq_big_seq => xi Sxi.
- have [nz_xi Nxi1] := (cfnorm_seqInd_neq0 nsHL Sxi, Cnat_seqInd1 Sxi).
- rewrite (normr_idP _) ?mulr_ge0 ?invr_ge0 ?ler0n ?cfnorm_ge0 ?Cnat_ge0 //.
- by rewrite mulrCA !exprMn ['[xi]]lock !mulrA divfK // -lock.
- apply/andP; rewrite -subr_ge0 addrK andbC -subr_ge0 addrC opprB subrK.
- rewrite pmulr_rge0 ?gt0CG // andbb -mulr_natr (mulrAC v).
- have v_ge0: 0 <= v by [rewrite invr_ge0 ler0n]; have L_gt0 := gt0CG L.
- have Lu: #|L|%:R * u = h - 1 by rewrite -eh -mulrA hu mulVKf.
- have h1ge0: 0 <= h - 1 by rewrite subr_ge0 ler1n cardG_gt0.
- have{h1ge0} u_ge0: 0 <= u by rewrite -Lu pmulr_rge0 in h1ge0.
- have [a_le0 | ] := boolP (a <= 0).
- by rewrite -mulrN -sqrrN addr_ge0 ?(u_ge0, mulr_ge0) ?oppr_ge0 ?ler0n.
- rewrite -real_ltrNge ?Creal_Cint // ltr_def => /andP[].
- move/(norm_Cint_ge1 Za)=> a_ge1 a_ge0; rewrite mulrA -mulrBl.
- rewrite (normr_idP _) // -(@mulVf _ 2%:R) ?pnatr_eq0 // in a_ge1.
- rewrite mulr_ge0 // subr_ge0 (ler_trans _ (ler_wpmul2l u_ge0 a_ge1)) // mulrA.
- by rewrite ler_wpmul2r ?ler0n // -(ler_pmul2l L_gt0) mulrA Lu -eh mulfK.
-have Zchi: chi \in 'Z[irr G] by rewrite def_chi irr_vchar.
-have def_chi0: {in A, chi^\rho =1 (fun _ => '[beta, chi])}.
- have defT1: perm_eq calT [:: zeta, Ind1H & S1].
- by rewrite defT (perm_catCA Ind1H zeta).
- move=> x Ax; have [_ Hx] := setD1P Ax.
- have [c _ -> // _] := invDade_seqInd_sum chi defT1.
- rewrite big_cons big1_seq ?addr0 /c => [|xi /S1P[neq_xi /= Sxi]]; last first.
- rewrite zeta1 -nu_tau ?defZS ?S_Se // raddfB cfdotBl raddfZ_Cnat ?NatS1e //.
- by rewrite cfdotZl !(orthoPr o_chiSnu) ?map_f // mulr0 subr0 conjC0 !mul0r.
- rewrite Ind1H1 zeta1 divff // scale1r -/beta aut_Cint ?Cint_cfdot_vchar //.
- by rewrite cfnorm_Ind_cfun1 ?cfInd_cfun1 // cfunE cfuniE // Hx mulr1 divfK.
-split=> //; rewrite -mulrA mulrCA cfnormE_invDade; congr (_ * _).
-rewrite mulr_natl -sumr_const; apply: eq_bigr => _ /def_chi0->.
-by rewrite Cint_normK ?Cint_cfdot_vchar.
-Qed.
-
-End Dade_seqIndC1.
-
-(* The other results of the section are specific to groups of odd order. *)
-Hypothesis oddG : odd #|G|.
-
-(* We explicitly factor out several intermediate results from the proof of *)
-(* (7.9) that are reused throughout the proof (including in (7.10) below). *)
-
-Import ssrint.
-Lemma cfdot_real_vchar_even phi psi :
- phi \in 'Z[irr G] /\ cfReal phi -> psi \in 'Z[irr G] /\ cfReal psi ->
- (2 %| '[phi, psi])%C = (2 %| '[phi, 1])%C || (2 %| '[psi, 1])%C.
-Proof.
-move=> [Zphi Rphi] [Zpsi Rpsi]; rewrite cfdot_vchar_r // (bigD1 (0 : 'I__)) //=.
-rewrite addrC -irr0 (bigID [pred i | conjC_Iirr i < i]%N) /=.
-set a1 := \sum_(i | _) _; set a2 := \sum_(i | _) _; suffices ->: a1 = a2.
- rewrite -mulr2n -mulr_natr (rpredDl _ (dvdC_mull _ _)) //; last first.
- by rewrite rpred_sum // => i; rewrite rpredM ?Cint_cfdot_vchar_irr.
- have /CintP[m1 ->] := Cint_cfdot_vchar_irr 0 Zphi.
- have /CintP[m2 ->] := Cint_cfdot_vchar_irr 0 Zpsi.
- rewrite [m1]intEsign [m2]intEsign !rmorphMsign mulrACA -!mulrA !rpredMsign.
- by rewrite -natrM !(dvdC_nat 2) Euclid_dvdM.
-rewrite /a2 (reindex_inj (inv_inj (@conjC_IirrK _ _))) /=.
-apply: eq_big => [t | t _]; last first.
- by rewrite !conjC_IirrE !cfdot_real_conjC ?aut_Cint ?Cint_cfdot_vchar_irr.
-rewrite (inv_eq (@conjC_IirrK _ _)) conjC_IirrK -leqNgt ltn_neqAle val_eqE.
-rewrite -!(inj_eq irr_inj) !conjC_IirrE irr0 cfConjC_cfun1 odd_eq_conj_irr1 //.
-by rewrite andbA andbb.
-Qed.
-
-Section DisjointDadeOrtho.
-
-Variables (L1 L2 H1 H2 : {group gT}).
-Let A1 := H1^#.
-Let A2 := H2^#.
-
-Hypothesis ddA1 : Dade_hypothesis G L1 A1.
-Hypothesis ddA2 : Dade_hypothesis G L2 A2.
-Let Atau1 := Dade_support ddA1.
-Let tau1 := Dade ddA1.
-Let Atau2 := Dade_support ddA2.
-Let tau2 := Dade ddA2.
-
-Hypothesis disjointA : [disjoint Atau1 & Atau2].
-
-Lemma disjoint_Dade_ortho phi psi : '[tau1 phi, tau2 psi] = 0.
-Proof.
-rewrite (cfdot_complement (Dade_cfunS _ _)) ?(cfun_onS _ (Dade_cfunS _ _)) //.
-by rewrite subsetD disjoint_sym Dade_support_sub.
-Qed.
-
-Let odd_Dade_context L H : Dade_hypothesis G L H^# -> H <| L /\ odd #|L|.
-Proof. by case=> nsAL sLG _ _ _; rewrite -normalD1 (oddSg sLG). Qed.
-
-(* This lemma encapsulates uses of lemma (4.1) in sections 7 and 14. *)
-Lemma disjoint_coherent_ortho nu1 nu2 chi1 chi2 :
- let S1 := seqIndD H1 L1 H1 1 in coherent_with S1 L1^# tau1 nu1 ->
- let S2 := seqIndD H2 L2 H2 1 in coherent_with S2 L2^# tau2 nu2 ->
- chi1 \in irr L1 -> chi1 \in S1 -> chi2 \in irr L2 -> chi2 \in S2 ->
- '[nu1 chi1, nu2 chi2] = 0.
-Proof.
-move=> S1 cohS1 S2 cohS2 /irrP[i1 ->] Schi1 /irrP[i2 ->] Schi2.
-have [[nsHL1 oddL1] [[Inu1 Znu1] nu1tau]] := (odd_Dade_context ddA1, cohS1).
-have [[nsHL2 oddL2] [[Inu2 Znu2] nu2tau]] := (odd_Dade_context ddA2, cohS2).
-pose nu_chiC L (nu : 'CF(L) -> 'CF(G)) i := map nu ('chi_i :: ('chi_i)^*)%CF.
-have: orthonormal (nu_chiC L1 nu1 i1) && orthonormal (nu_chiC L2 nu2 i2).
- rewrite /orthonormal /= !andbT !Inu1 ?Inu2 ?seqInd_zcharW ?cfAut_seqInd //=.
- rewrite !cfnorm_conjC !cfnorm_irr (seqInd_conjC_ortho _ _ _ Schi1) ?eqxx //=.
- by rewrite (seqInd_conjC_ortho _ _ _ Schi2).
-move/orthonormal_vchar_diff_ortho=> -> //.
- by split; apply/allP; rewrite /= !(Znu1, Znu2) ?seqInd_zcharW ?cfAut_seqInd.
-rewrite -!raddfB !(nu1tau, nu2tau) ?zcharD1_seqInd ?seqInd_sub_aut_zchar //.
-by rewrite !Dade1 disjoint_Dade_ortho !eqxx.
-Qed.
-
-(* This is Peterfalvi (7.9). *)
-(* We have inlined Hypothesis (7.4) because although it is readily available *)
-(* for the proof of (7.10), it would be inconvenient to establish in (14.4). *)
-(* Note that our Delta corresponds to Delta - 1 in the Peterfalvi proof. *)
-Let beta L H ddA zeta := @Dade _ G L H^# ddA ('Ind[L, H] 1 - zeta).
-Lemma Dade_sub_lin_nonorthogonal nu1 nu2 zeta1 zeta2 :
- let S1 := seqIndD H1 L1 H1 1 in coherent_with S1 L1^# tau1 nu1 ->
- let S2 := seqIndD H2 L2 H2 1 in coherent_with S2 L2^# tau2 nu2 ->
- zeta1 \in irr L1 -> zeta1 \in S1 -> zeta1 1%g = #|L1 : H1|%:R ->
- zeta2 \in irr L2 -> zeta2 \in S2 -> zeta2 1%g = #|L2 : H2|%:R ->
- '[beta ddA1 zeta1, nu2 zeta2] != 0 \/ '[beta ddA2 zeta2, nu1 zeta1] != 0.
-Proof.
-move=> S1 cohS1 S2 cohS2 irr_zeta1 Szeta1 zeta1_1 irr_zeta2 Szeta2 zeta2_1.
-apply/nandP; pose Delta ddA nu zeta := beta ddA zeta + nu zeta.
-have Delta_context L H (A := H^#) ddA (tau := Dade ddA) nu zeta :
- let S := seqIndD H L H 1 in coherent_with S L^# tau nu ->
- zeta \in irr L -> zeta \in S -> zeta 1%g = #|L : H|%:R ->
- let D := Delta L H ddA nu zeta in '[D, 1] = 1 /\ D \in 'Z[irr G] /\ cfReal D.
-- move=> S cohS irr_zeta Szeta zeta_1 D.
- have [[nsHL oddL] [[_ Znu] nu_tau]] := (odd_Dade_context ddA, cohS).
- have ntS: (size S > 1)%N by apply: seqInd_nontrivial Szeta.
- have [[nuS1_0 beta1_1 Zbeta] _ _] :=
- Dade_Ind1_sub_lin cohS ntS irr_zeta Szeta zeta_1.
- rewrite cfdotDl {}beta1_1 {nuS1_0}(orthoPr nuS1_0) ?map_f // addr0.
- rewrite rpredD ?{}Znu ?seqInd_zcharW {Zbeta}// /cfReal; do !split=> //.
- rewrite rmorphD /= -subr_eq0 opprD addrAC addrA -addrA addr_eq0 opprD.
- rewrite (cfConjC_Dade_coherent cohS) // opprK -Dade_conjC -!raddfB /=.
- rewrite nu_tau ?zcharD1_seqInd ?seqInd_sub_aut_zchar //=.
- by rewrite rmorphB /= conj_cfInd cfConjC_cfun1 opprB addrC addrA subrK.
-have: ~~ (2 %| '[Delta L1 H1 ddA1 nu1 zeta1, Delta L2 H2 ddA2 nu2 zeta2])%C.
- have /Delta_context/(_ irr_zeta1 Szeta1 zeta1_1)[Delta1_1 ZR_Delta1] := cohS1.
- have /Delta_context/(_ irr_zeta2 Szeta2 zeta2_1)[Delta2_1 ZR_Delta2] := cohS2.
- by rewrite cfdot_real_vchar_even // Delta1_1 Delta2_1 (dvdC_nat 2 1).
-rewrite cfdotDl !cfdotDr disjoint_Dade_ortho // add0r addrC cfdotC.
-apply: contra => /andP[/eqP-> /eqP->]; rewrite conjC0 add0r addr0.
-by rewrite (disjoint_coherent_ortho cohS1 cohS2) ?dvdC0.
-Qed.
-
-End DisjointDadeOrtho.
-
-(* A numerical fact used in Sections 7 and 14. *)
-Lemma odd_Frobenius_index_ler (R : numFieldType) (K L : {group gT}) :
- odd #|L| -> [Frobenius L with kernel K] ->
- #|L : K|%:R <= (#|K|%:R - 1) / 2%:R :> R.
-Proof.
-move=> oddL /existsP[H frobL]; rewrite ler_pdivl_mulr ?ltr0n // ler_subr_addl.
-have ->: #|L : K| = #|H| by have [/index_sdprod] := Frobenius_context frobL.
-by rewrite -natrM -mulrS ler_nat muln2 (ltn_odd_Frobenius_ker frobL).
-Qed.
-
-(* This final section factors the assumptions common to (7.10) and (7.11). *)
-(* We add solvability of the Frobenius groups, so as not to rely on the *)
-(* theorem of Thompson asserting the nilpotence of Frobenius kernels. *)
-
-Section CoherentFrobeniusPartition.
-
-Variables (k : nat) (L H E : 'I_k -> {group gT}).
-
-Local Notation A i := (gval (H i))^#.
-Let h_ i : algC := #|H i|%:R.
-Let e_ i : algC := #|L i : H i|%:R.
-Let G0 := G :\: \bigcup_(i < k) class_support (H i)^# G.
-
-Hypothesis k_ge2: (k >= 2)%N.
-
-(*a*) Hypothesis frobeniusL_G :
- forall i, [/\ L i \subset G, solvable (L i) & [Frobenius L i = H i ><| E i]].
-
-(*b*) Hypothesis normedTI_A : forall i, normedTI (A i) G (L i).
-
-(*c*) Hypothesis card_coprime : forall i j, i != j -> coprime #|H i| #|H j|.
-
-(* A numerical fact that is used in both (7.10) and (7.11) *)
-Let e_bounds i : 1 < e_ i /\ e_ i <= (h_ i - 1) / 2%:R.
-Proof.
-have [/oddSg/(_ oddG)oddL _ frobL] := frobeniusL_G i.
-rewrite ltr1n odd_Frobenius_index_ler ?(FrobeniusWker frobL) //.
-by have [/index_sdprod <-] := Frobenius_context frobL; rewrite cardG_gt1.
-Qed.
-
-(* This is Peterfalvi (7.10). *)
-Lemma coherent_Frobenius_bound : exists i, let e := e_ i in let h := h_ i in
- (e - 1) * ((h - 2%:R * e - 1) / (e * h) + 2%:R / (h * (h + 2%:R)))
- <= (#|G0|%:R - 1) / #|G|%:R.
-Proof.
-have [sLG solL frobL] := all_and3 frobeniusL_G.
-have oddL i := oddSg (sLG i) oddG.
-have /all_and2[nsHL ntH] i: H i <| L i /\ H i :!=: 1%g.
- by case/Frobenius_context: (frobL i) => /sdprod_context[].
-have sHL i: H i \subset L i by case/andP: (nsHL i).
-pose DH i := @Dade_signalizer gT G (L i) (A i).
-have /fin_all_exists[ddA DH1] i: exists dd, {in A i, forall a, DH i dd a = 1%G}.
- have /Dade_normedTI_P[|ddAi _] := normedTI_A i; last by exists ddAi.
- by apply: normedTI_Dade => //; rewrite setSD // (subset_trans (sHL i)).
-pose tau i := Dade (ddA i); pose rho i := invDade (ddA i).
-pose Atau i := Dade_support (ddA i).
-have defAtau i: Atau i = class_support (A i) G.
- rewrite class_supportEl; apply: eq_bigr => x Ax.
- by rewrite /Dade_support1 -/(DH i) DH1 // mul1g class_support_set1l.
-have disjoint_Atau i j : i != j -> [disjoint Atau i & Atau j].
- move=> neq_ij; rewrite !defAtau !class_supportEr -setI_eq0 big_distrlr /=.
- rewrite pair_big big1 // => [[x y] _] /=; apply/eqP.
- by rewrite !conjD1g -setDIl setD_eq0 coprime_TIg // !cardJg card_coprime.
-have{defAtau} defG0: G0 = G :\: \bigcup_i Atau i.
- by congr (_ :\: _); apply: eq_bigr => i; rewrite defAtau.
-pose S i := seqIndD (H i) (L i) (H i) 1.
-have irrS i: {subset S i <= irr (L i)}.
- move=> _ /seqIndC1P[t nz_t ->]; rewrite irr_induced_Frobenius_ker //.
- exact: FrobeniusWker (frobL i).
-have /fin_all_exists[r lin_r] i: exists r, 'chi_r \in S i /\ 'chi_r 1%g = e_ i.
- have lt1Hi: [1] \proper H i by rewrite proper1G.
- have solHi := solvableS (sHL i) (solL i).
- have [xi Sxi lin_xi] := exists_linInd (nsHL i) solHi lt1Hi (normal1 _).
- by have /irrP[r def_xi] := irrS i xi Sxi; exists r; rewrite -def_xi.
-have{lin_r} [Sr r1] := all_and2 lin_r.
-have ntS i: (size (S i) > 1)%N by apply: seqInd_nontrivial (Sr i).
-have /fin_all_exists[nu cohS] i: coherent (S i) (L i)^# 'Ind[G, L i].
- have [[[frobLi tiAiL] sLiG] oddLi] := (frobL i, normedTI_A i, sLG i, oddL i).
- have [defLi ntHi ntEi _ _] := Frobenius_context frobLi.
- have{ntEi} nilHi: nilpotent (H i) by apply: (Frobenius_sol_kernel_nil frobLi).
- exact: Sibley_coherence (or_introl _ frobLi).
-have{cohS} [/all_and2[Inu Znu] nu_Ind] := all_and2 cohS.
-have{DH DH1 nu_Ind} cohS i: coherent_with (S i) (L i)^# (tau i) (nu i).
- split=> // phi Sphi; rewrite /tau nu_Ind ?Dade_Ind //.
- by rewrite (@zchar_on _ _ (S i)) -?zcharD1_seqInd.
-have n1S i xi: xi \in S i -> '[xi] = 1.
- by case/irrS/irrP=> t ->; rewrite cfnorm_irr.
-have n1Snu i xi: xi \in S i -> '[nu i xi] = 1.
- by move=> Sxi; rewrite Inu ?n1S ?seqInd_zcharW.
-have o_nu i j: i != j -> {in S i & S j, forall xi xj, '[nu i xi, nu j xj] = 0}.
- move/disjoint_Atau/disjoint_coherent_ortho=> o_ij xi xj Sxi Sxj.
- by rewrite o_ij ?irrS //; apply: cohS.
-have /all_and2[nze nzh] i: e_ i != 0 /\ h_ i != 0 by rewrite neq0CiG neq0CG.
-have h_gt1 i: 1 < h_ i by rewrite ltr1n cardG_gt1.
-have eh i: e_ i * h_ i = #|L i|%:R by rewrite -natrM mulnC Lagrange.
-have def_h1 i: h_ i - 1 = #|A i|%:R.
- by rewrite /h_ (cardsD1 1%g) group1 addnC natrD addrK.
-have [i1 min_i1]: {i1 | forall i, i != i1 -> h_ i1 + 2%:R <= h_ i}.
- exists [arg min_(i < Ordinal k_ge2) #|H i|]; case: arg_minP => // i1 _ min_i1.
- have oddH i: #|H i| = #|H i|./2.*2.+1.
- by rewrite -{1}[#|H i|]odd_double_half (oddSg (sHL i)).
- move=> i neq_i; rewrite -natrD ler_nat (oddH i) oddH addn2 -doubleS ltnS.
- rewrite leq_double ltn_neqAle andbC half_leq ?min_i1 //=.
- apply: contraTneq (card_coprime neq_i) => eqHii1.
- by rewrite oddH -eqHii1 -oddH /coprime gcdnn -trivg_card1.
-exists i1 => e h; set lhs := (e - 1) * _.
-have nzh2: h + 2%:R != 0 by rewrite -natrD addnC pnatr_eq0.
-have{lhs} ->: lhs = 1 - e / h - (h - 1) / (e * h) - (e - 1) / (h + 2%:R).
- rewrite {}/lhs -{2}(addrK h 2%:R) !invfM (mulrBl _ _ h) mulVKf ?nzh //.
- rewrite addrCA (addrC _ h) mulrCA mulrA addrA mulrBr; congr (_ - _).
- rewrite mulfK // mulrDr addrAC addrC mulrC mulrBl -mulrA mulVKf ?nze //.
- rewrite mulrC mulrBr mulrBl mul1r addrAC addrC addrA; congr (_ - _).
- rewrite mulrCA mulVKf ?nze // addrCA mulrCA mulr_natl opprD addNKr.
- by rewrite !mulrBl opprB addrA subrK divff ?nzh.
-pose beta i := tau i ('Ind[L i, H i] 1 - 'chi_(r i)).
-have betaP i := Dade_Ind1_sub_lin (cohS i) (ntS i) (mem_irr _) (Sr i) (r1 i).
-pose chi i := nu i 'chi_(r i); pose c i j := '[beta i, chi j].
-have:= betaP i1; rewrite -/(S _) -/(tau _) -/(beta _) -/(chi _) -/(e_ _) -/e.
-move=> [[oSnu1 o_beta1 Zbeta1] [Gamma [oSnuGamma oGamma1] [a Za def_beta1]]].
-have [_ lt_e_h2] := e_bounds i1; rewrite -/(rho _) -/(h_ _) -/h.
-case/(_ lt_e_h2)=> min_rho1 maxGamma _ {lt_e_h2}.
-pose calB := [set i | (i != i1) && (c i i1 == 0)].
-pose sumB := \sum_(i in calB) (h_ i - 1) / (e_ i * h_ i).
-suffices{min_rho1} sumB_max: sumB <= (e - 1) / (h + 2%:R).
- rewrite -subr_ge0 opprB addrCA -opprB subr_ge0; apply: ler_trans sumB_max.
- rewrite -subr_ge0 opprB addrCA -(opprB _ sumB) subr_ge0.
- have Zchi1: chi i1 \in 'Z[irr G] by rewrite Znu ?seqInd_zcharW ?Sr.
- have [eps [t def_chi1]] := vchar_norm1P Zchi1 (n1Snu i1 'chi_(r i1) (Sr i1)).
- pose sumG0 := \sum_(g in G0) `|'chi_t g| ^+ 2.
- apply: (@ler_trans _ ((#|G0|%:R - sumG0) / #|G|%:R)); last first.
- rewrite ler_pmul2r ?invr_gt0 ?gt0CG // ler_add2l ler_opp2.
- rewrite [sumG0](bigD1 1%g) /=; last first.
- rewrite !inE group1 andbT; apply/bigcupP=> [[i _]].
- by rewrite class_supportEr => /bigcupP[x _]; rewrite conjD1g !inE eqxx.
- rewrite -[1]addr0 ler_add ?sumr_ge0 // => [|x _]; last first.
- by rewrite -normrX normr_ge0.
- have Zchit1: 'chi_t 1%g \in Cint by rewrite CintE Cnat_irr1.
- by rewrite expr_ge1 ?normr_ge0 // norm_Cint_ge1 ?irr1_neq0.
- pose ea i : algC := #|(H i)^#|%:R / #|L i|%:R.
- apply: (@ler_trans _ (\sum_i ('[rho i 'chi_t] - ea i))); last first.
- rewrite -subr_ge0 -opprB oppr_ge0 -mulNr opprB addrC mulrC.
- by rewrite /sumG0 defG0 Dade_cover_inequality ?cfnorm_irr.
- rewrite (bigID (mem calB)) /= addrC ler_add //.
- rewrite -subr_ge0 opprK -big_split sumr_ge0 //= => i _.
- by rewrite def_h1 eh subrK cfnorm_ge0.
- rewrite (bigD1 i1) ?inE ?eqxx ?andbF //= -ler_subl_addl (@ler_trans _ 0) //.
- rewrite opprB /ea -def_h1 -eh -/h -/e addrA subrK subr_le0.
- by rewrite -(cfnorm_sign eps) -linearZ -def_chi1.
- rewrite sumr_ge0 // => i; rewrite inE /c andbC => /andP[neq_i].
- rewrite neq_i subr_ge0 def_chi1 cfdotZr mulf_eq0 => /norP[_ not_o_beta_chi].
- have [[_ _ Zbeta_i] _ /(_ _ (mem_irr t))[|_ ->]] := betaP i.
- apply/orthoPr=> _ /mapP[xi Sxi ->]; rewrite -['chi_t](signrZK eps).
- by rewrite -def_chi1 cfdotZr o_nu ?mulr0 ?Sr.
- rewrite -[ea i]mulr1 /ea ler_wpmul2l ?mulr_ge0 ?invr_ge0 ?ler0n //.
- by rewrite -/(tau i) -/(beta i) sqr_Cint_ge1 ?Cint_cfdot_vchar_irr.
-rewrite -(mulfK nzh2 sumB) -{2 3}natrD ler_wpmul2r ?invr_ge0 ?ler0n //.
-apply: ler_trans maxGamma; rewrite mulr_suml.
-pose phi i : 'CF(G) := \sum_(xi <- S i) xi 1%g / e_ i / '[xi] *: nu i xi.
-have o_phi_nu i j xi: i != j -> xi \in S j -> '[phi i, nu j xi] = 0.
- move/o_nu=> o_ij Sxi; rewrite cfdot_suml big1_seq //= => pi Spi.
- by rewrite cfdotZl o_ij ?mulr0.
-have o_phi i j: i != j -> '[phi i, phi j] = 0.
- move/o_phi_nu=> o_ij; rewrite cfdot_sumr big1_seq // => xi Sxi.
- by rewrite cfdotZr o_ij ?mulr0.
-pose X : 'CF(G) := \sum_(i in calB) c i1 i *: phi i; pose Gamma1 := Gamma - X.
-have ->: Gamma = Gamma1 + X by rewrite subrK.
-have{betaP def_beta1} /cfnormDd->: '[Gamma1, X] = 0.
- rewrite cfdot_sumr big1 // => i Bi; have [neq_i _] := setIdP Bi.
- rewrite cfdotZr cfdot_sumr big1_seq ?mulr0 //= => xi Sxi.
- apply/eqP; rewrite cfdotZr cfdotBl mulf_eq0; apply/pred2P; right.
- rewrite cfdot_suml (bigD1 i) ?big1 //= => [|j /andP[_ neq_j]]; last first.
- by rewrite cfdotZl o_phi_nu ?mulr0.
- rewrite cfdotZl cfproj_sum_orthogonal ?seqInd_orthogonal //; last exact: Inu.
- rewrite n1S // divr1 mulr1 addr0 mulrC -(canLR (addKr _) def_beta1).
- rewrite !(cfdotDl, cfdotNl) cfdotZl o_nu ?o_phi_nu ?Sr 1?eq_sym // mulr0.
- have[[/orthoPr oSnui_1 _ _] _ _] := betaP i; rewrite -/(S i) in oSnui_1.
- rewrite cfdotC oSnui_1 ?map_f // conjC0 !(add0r, oppr0).
- have Nxie: xi 1%g / e_ i \in Cnat by apply: dvd_index_seqInd1 _ Sxi.
- rewrite -(conj_Cnat Nxie) // -cfdotZr -raddfZ_Cnat // -!raddfB /=.
- have [_ Dnu] := cohS i.
- rewrite Dnu ?zcharD1_seqInd ?seqInd_sub_lin_vchar ?Sr ?r1 //.
- by rewrite disjoint_Dade_ortho ?disjoint_Atau 1?eq_sym.
-rewrite -subr_ge0 cfdot_sumr -addrA -sumrB addr_ge0 ?cfnorm_ge0 //.
-rewrite sumr_ge0 // => i Bi; have [neq_i ci1_0] := setIdP Bi.
-have n_phi: '[phi i] = (h_ i - 1) / e_ i.
- rewrite cfnorm_sum_orthogonal ?seqInd_orthogonal //; last exact: Inu.
- rewrite -[_ - 1](mulKf (nze i)) -sum_seqIndC1_square // -/(S i) mulrAC.
- rewrite -invfM mulrC mulr_suml; apply: eq_big_seq => _ /irrS/irrP[t ->].
- rewrite cfnorm_irr !divr1 mulr1 -expr2 -exprVn -exprMn.
- by rewrite (normr_idP _) // mulr_ge0 ?invr_ge0 ?ler0n // ltrW ?irr1_gt0.
-rewrite subr_ge0 cfdotZr cfdot_suml (bigD1 i) //=.
-rewrite big1 ?addr0 => [|j /andP[_ ne_j]]; last by rewrite cfdotZl o_phi ?mulr0.
-rewrite cfdotZl invfM 2!mulrA -n_phi -[_ * _]mulrA mulrC.
-rewrite ler_wpmul2r ?cfnorm_ge0 // (@ler_trans _ 1) //.
- by rewrite -{2}(mulVf (nzh i)) ler_wpmul2l ?invr_ge0 ?ler0n ?min_i1.
-rewrite mulrC -normCK expr_ge1 ?normr_ge0 // norm_Cint_ge1 //.
- rewrite Cint_cfdot_vchar ?Znu ?seqInd_zcharW ?Sr //.
-suffices []: c i i1 != 0 \/ c i1 i != 0 by rewrite ?ci1_0.
-apply/Dade_sub_lin_nonorthogonal; rewrite ?mem_irr ?Sr ?r1 //; try exact: cohS.
-exact: disjoint_Atau.
-Qed.
-
-(* This is Peterfalvi (7.11). *)
-Theorem no_coherent_Frobenius_partition : G0 != 1%G.
-Proof.
-have [i] := coherent_Frobenius_bound; apply: contraTneq => ->.
-have [] := e_bounds i; set e := e_ i; set h := h_ i => e_gt1 le_e_h2.
-rewrite cards1 subrr mul0r ltr_geF // pmulr_rgt0 ?subr_gt0 // ltr_paddl //.
- rewrite ?(mulr_ge0, invr_ge0) ?ler0n // addrAC subr_ge0.
- by rewrite -[_ - 1](@divfK _ 2%:R) ?pnatr_eq0 // mulrC ler_wpmul2r ?ler0n.
-by rewrite -natrD addnC ?(pmulr_rgt0, invr_gt0) ?ltr0n.
-Qed.
-
-End CoherentFrobeniusPartition.
-
-End Seven.
-