diff options
| author | Enrico Tassi | 2015-03-09 11:07:53 +0100 |
|---|---|---|
| committer | Enrico Tassi | 2015-03-09 11:24:38 +0100 |
| commit | fc84c27eac260dffd8f2fb1cb56d599f1e3486d9 (patch) | |
| tree | c16205f1637c80833a4c4598993c29fa0fd8c373 /mathcomp/odd_order/PFsection7.v | |
Initial commit
Diffstat (limited to 'mathcomp/odd_order/PFsection7.v')
| -rw-r--r-- | mathcomp/odd_order/PFsection7.v | 819 |
1 files changed, 819 insertions, 0 deletions
diff --git a/mathcomp/odd_order/PFsection7.v b/mathcomp/odd_order/PFsection7.v new file mode 100644 index 0000000..eed77b7 --- /dev/null +++ b/mathcomp/odd_order/PFsection7.v @@ -0,0 +1,819 @@ +(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *) +Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice. +Require Import fintype tuple finfun bigop prime ssralg poly finset center. +Require Import fingroup morphism perm automorphism quotient action zmodp. +Require Import gfunctor gproduct cyclic pgroup commutator nilpotent frobenius. +Require Import matrix mxalgebra mxrepresentation BGsection3 vector. +Require Import ssrnum algC classfun character inertia vcharacter. +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; exact: 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 -4!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; exact: 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 (mem_irr _) (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 /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. +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. + |
