diff --git a/theories/PFsection1.v b/theories/PFsection1.v index 8e0b539..8013f53 100644 --- a/theories/PFsection1.v +++ b/theories/PFsection1.v @@ -12,7 +12,7 @@ Require Import poly cyclic pgroup nilpotent matrix mxalgebra mxrepresentation. From mathcomp Require Import vector falgebra fieldext ssrnum algC rat algnum galois. From mathcomp -Require Import classfun character inertia integral_char vcharacter. +Require Import forms classfun character inertia integral_char vcharacter. From mathcomp Require ssrint. @@ -109,7 +109,7 @@ have F0 (j : 'I_m) : (\sum_i '[Phi`_j, 'chi_i] * (d i)^* == '['Ind Phi`_j, mu]) = ('[Phi`_j, D] == 0). rewrite raddfB raddf_sum /= Frobenius_reciprocity subr_eq0 eq_sym. - by congr (_ == _); apply: eq_bigr=> i _; rewrite cfdotZr mulrC. + by congr (_ == _); apply: eq_bigr=> i _; rewrite linearZ mulrC. split=> [HH j | HH]. by apply/eqP; rewrite F0; apply/eqP; apply: cfdot_complement. have{F0} F1 (j : 'I_m) : '[Phi`_j, D]_H = 0. @@ -117,8 +117,8 @@ have{F0} F1 (j : 'I_m) : '[Phi`_j, D]_H = 0. have: (D \in 'CF(H))%VS by rewrite memvf. rewrite -(cfun_complement nsAH) => /memv_addP[f Cf [g Cg defD]]. have: '[f, f + g] = 0. - rewrite -defD (coord_basis BPhi Cf) cfdot_suml. - by rewrite big1 // => i _; rewrite cfdotZl F1 mulr0. + rewrite -defD (coord_basis BPhi Cf) linear_suml. + by rewrite big1 // => i _; rewrite linearZl_LR /= F1 [_*:_]mulr0. rewrite raddfD /= {1}(cfdot_complement Cf Cg) addr0 => /eqP. by rewrite cfnorm_eq0 defD => /eqP->; rewrite add0r. Qed. @@ -135,13 +135,13 @@ move=> HsG nsAH /equiv_restrict_compl Phi_A Mo IP; split=> [/= i | mu Cmu x Ax]. have->: 'chi[H]_i = \sum_j (j == i)%:R *: 'chi_j. rewrite (bigD1 i) //= eqxx scale1r big1 ?addr0 // => j /negPf->. by rewrite scale0r. - apply/Phi_A=> // j; rewrite IP cfdot_suml. - by apply: eq_bigr=> k _; rewrite cfdotZl rmorph_nat Mo. + apply/Phi_A=> // j; rewrite IP linear_suml. + by apply: eq_bigr=> k _; rewrite linearZl_LR /= rmorph_nat Mo. transitivity ((\sum_j 0 *: 'chi[H]_j) x); last first. by rewrite sum_cfunE big1 // => j _; rewrite cfunE mul0r. move: x Ax; apply/Phi_A=> // j. -rewrite -mulr_suml rmorph0 mulr0 IP cfdot_suml big1 // => k _. -by rewrite cfdotZl [d in _ * d]cfdotC Cmu rmorph0 mulr0. +rewrite -mulr_suml rmorph0 mulr0 IP linear_suml big1 // => k _. +by rewrite linearZl_LR /= [d in _ *: d] cfdotC Cmu rmorph0 [_ *: _]mulr0. Qed. Let vchar_isometry_base3 f f' : @@ -176,7 +176,7 @@ Let vchar_isometry_base4 (eps : bool) i j k n m : Proof. move=> /= Hjk; wlog ->: eps n m / eps = false. case: eps; last exact; move/(_ false m n)=> IH nm_ji nm_ki. - by apply: IH; rewrite // -opprB cfdotNl (nm_ji, nm_ki) opprK. + by apply: IH; rewrite // -opprB linearNl /= (nm_ji, nm_ki) opprK. rewrite !cfdotBl !cfdotBr !cfdot_irr !opprB addrAC addrA. do 2!move/(canRL (subrK _)); rewrite -(natrD _ 1) -!natrD. move/(can_inj natCK); case: (m == i) => //. @@ -185,6 +185,7 @@ rewrite subr0 add0r => /(canRL (subrK _)); rewrite -(natrD _ 1). by move/(can_inj natCK); rewrite (negbTE Hjk). Qed. + (* This is Peterfalvi (1.4). *) Lemma vchar_isometry_base m L (Chi : m.-tuple 'CF(H)) (tau : {linear 'CF(H) -> 'CF(G)}) : @@ -212,10 +213,10 @@ have DF i j : F i j = F i 0 - F j 0 by rewrite /F opprB addrA subrK. have ZF i j: F i j \in 'Z[Chi, L]. by rewrite zchar_split rpredB ?mem_zchar // DF memvB // /F !chiE. have htau2 i j: i != j -> '[tau (F i j)] = 2%:R. - rewrite iso_tau // cfnormB -cfdotC !dot_chi !eqxx eq_sym => /negbTE->. + rewrite iso_tau // hnormB -hermC /= !dot_chi !eqxx eq_sym => /negbTE->. by rewrite -!natrD subr0. have htau1 i j: j != 0 -> j != i -> i != 0 -> '[tau (F i 0), tau (F j 0)] = 1. - rewrite iso_tau // cfdotBl !cfdotBr opprB !dot_chi !(eq_sym j). + rewrite iso_tau // linearBl !linearBr opprB /= !dot_chi !(eq_sym j). by do 3!move/negbTE->; rewrite !subr0 add0r. have [m0 | nz_m] := boolP (m == 0%N). rewrite -2!eqSS eq_sym in m0; move: (htau2 1 0 isT). @@ -240,8 +241,8 @@ have muP i: have [-> | neq_i2] := eqVneq i i2; first by exists k2; rewrite // -eq20. have:= @vchar_isometry_base4 (~~ e) k0 k1 k2 k k' nek12. have ZdK u v w: '[u, v - w]_G = (-1) ^+ (~~ e) * '[u, d *: (w - v)]. - rewrite cfdotZr rmorph_sign mulrA -signr_addb addNb addbb mulN1r. - by rewrite -cfdotNr opprB. + rewrite linearZ /= rmorph_sign mulrA -signr_addb addNb addbb mulN1r. + by rewrite -linearNr opprB. rewrite -eqFkk' ZdK -eq10 {}ZdK -eq20 !htau1 //; try by rewrite eq_sym. move/(_ (mulr1 _) (mulr1 _)); rewrite /d eqFkk'. by case e => /eqP <-; [exists k | exists k']; rewrite ?scaler_sign ?opprB. @@ -285,8 +286,8 @@ Lemma cfnorm_Ind_irr t : H <| G -> '['Ind[G] 'chi[H]_t] = #|'I_G['chi_t] : H|%:R. Proof. set r := _%:R => HnG; have HsG := normal_sub HnG. -rewrite -Frobenius_reciprocity cfResInd_sum_cfclass //= cfdotZr rmorph_nat -/r. -rewrite reindex_cfclass // cfdot_sumr (bigD1 t) ?cfclass_refl //= cfnorm_irr. +rewrite -Frobenius_reciprocity cfResInd_sum_cfclass //= linearZ /= rmorph_nat -/r. +rewrite reindex_cfclass // linear_sumr (bigD1 t) ?cfclass_refl //= cfnorm_irr. rewrite big1 ?addr0 ?mulr1 // => j /andP[_ /negbTE]. by rewrite eq_sym cfdot_irr => ->. Qed. @@ -306,8 +307,8 @@ Lemma cfclass_Ind_cases t1 t2 : H <| G -> else '['Ind[G] 'chi_t1, 'Ind[G] 'chi_t2] = 0. Proof. move=> nsHG; have [/cfclass_Ind-> // | not_ch1Gt2] := ifPn. -rewrite -Frobenius_reciprocity cfResInd_sum_cfclass // cfdotZr rmorph_nat. -rewrite cfdot_sumr reindex_cfclass // big1 ?mulr0 // => j; rewrite cfdot_irr. +rewrite -Frobenius_reciprocity cfResInd_sum_cfclass // linearZ /= rmorph_nat. +rewrite linear_sumr reindex_cfclass // big1 ?mulr0 // => j; rewrite /= cfdot_irr. case: eqP => // <- /idPn[]; apply: contra not_ch1Gt2 => /cfclassP[y Gy ->]. by apply/cfclassP; exists y^-1%g; rewrite ?groupV ?cfConjgK. Qed. @@ -508,9 +509,9 @@ have psiHG: 'Ind ('Res[H] psi1) = \sum_j 'chi_(LtoT j). have imLtoT: {subset calA <= codom LtoT}. move=> t At; apply/codomP/exists_eqP. have{At}: t \in irr_constt ('Ind ('Res[H] 'chi_t1)). - by rewrite Dpsi1H linearZ irr_consttE cfdotZl mulf_neq0. + by rewrite Dpsi1H linearZ irr_consttE linearZl_LR mulf_neq0. apply: contraR; rewrite negb_exists => /forallP imL't. - by rewrite psiHG cfdot_suml big1 // => j _; rewrite cfdot_irr mulrb ifN_eqC. + by rewrite psiHG linear_suml big1 //= => j _; rewrite cfdot_irr mulrb ifN_eqC. have De_ t: t \in calA -> e_ t = e. case/imLtoT/codomP=> j ->; rewrite /e_ LtoTE /e -!cfdot_Res_r rmorphM /=. by rewrite cfRes_sub_ker ?cfker_mod // mulr_algl lin_char1 ?scale1r. diff --git a/theories/PFsection10.v b/theories/PFsection10.v index 3bca9b8..a78596c 100644 --- a/theories/PFsection10.v +++ b/theories/PFsection10.v @@ -16,7 +16,7 @@ Require Import matrix mxalgebra mxrepresentation mxabelem vector. From odd_order Require Import BGsection1 BGsection3 BGsection7 BGsection15 BGsection16. From mathcomp -Require Import ssrnum algC classfun character integral_char inertia vcharacter. +Require Import ssrnum algC forms classfun character integral_char inertia vcharacter. From odd_order Require Import PFsection1 PFsection2 PFsection3 PFsection4. From odd_order @@ -59,6 +59,15 @@ Implicit Types H K L N P Q R S T U W : {group gT}. Local Notation "#1" := (inord 1) (at level 0). +Notation pairwise_orthogonal := (pairwise_orthogonal [hermitian of @cfdot _ _]). +Notation pairwise_orthogonalP := (pairwise_orthogonalP [dot of @cfdot _ _]). +Notation orthogonal := (orthogonal [hermitian of @cfdot _ _]). +Notation orthogonalP := (orthogonalP [hermitian of @cfdot _ _]). +Notation orthonormal := (orthonormal [hermitian of @cfdot _ _]). +Notation orthonormalP := (orthonormalP [dot of @cfdot _ _]). +Notation orthogonal_split := (orthogonal_split [dot of @cfdot _ _]). + + Section OneMaximal. (* These assumptions correspond to Peterfalvi, Hypothesis (10.1). *) @@ -262,7 +271,7 @@ Hypothesis (zeta1w1 : zeta 1%g = w1%:R). Let o_mu2_zeta i j : '[mu2_ i j, zeta] = 0. Proof. exact: o_mu2_irr. Qed. Let o_mu_zeta j : '[mu_ j, zeta] = 0. -Proof. by rewrite cfdot_suml big1 // => i _; apply: o_mu2_zeta. Qed. +Proof. by rewrite linear_suml big1 // => i _; apply: o_mu2_zeta. Qed. Definition FTtype345_bridge i j := mu2_ i j - delta *: mu2_ i 0 - n *: zeta. Local Notation alpha_ := FTtype345_bridge. @@ -320,11 +329,11 @@ Local Notation Zalpha_tau := vchar_Dade_FTtype345_bridge. Lemma norm_FTtype345_bridge i j : j != 0 -> '[(alpha_ i j)^\tau] = 2%:R + n ^+ 2. Proof. -move=> nz_j; rewrite Dade_isometry ?alpha_on // cfnormBd ?cfnormZ; last first. - by rewrite cfdotZr cfdotBl cfdotZl !o_mu2_zeta !(mulr0, subr0). +move=> nz_j; rewrite Dade_isometry ?alpha_on // hnormBd /= ?dnormZ /=; last first. + by rewrite linearZ /= linearBl linearZl_LR /= !o_mu2_zeta [_ *: _]mulr0 subr0 mulr0. have [_ _ _ /Cnat_ge0 n_ge0] := FTtype345_constants. -rewrite ger0_norm // cfnormBd ?cfnorm_sign ?cfnorm_irr ?irrWnorm ?mulr1 //. -by rewrite cfdotZr (cfdot_prTIirr pddM) (negPf nz_j) andbF ?mulr0. +rewrite ger0_norm // hnormBd /= ?hnorm_sign /= ?cfnorm_irr ?irrWnorm ?mulr1 //=. +by rewrite linearZ /= (cfdot_prTIirr pddM) (negPf nz_j) andbF ?mulr0. Qed. Local Notation norm_alpha := norm_FTtype345_bridge. @@ -343,7 +352,7 @@ have [|z Zz defY] := zchar_expansion _ S1_Y. rewrite map_inj_in_uniq; first by case: sS10. by apply: sub_in2 (Zisometry_inj Itau1); apply: mem_zchar. have nX_2: '[X] = 2%:R. - apply: (addrI '[Y]); rewrite -cfnormDd // addrC -Dalpha norm_alpha //. + apply: (addrI '[Y]); rewrite -hnormDd // addrC -Dalpha /= norm_alpha //. by rewrite addrC nY_n2. have Z_X: X \in 'Z[irr G]. rewrite -[X](addrK Y) -Dalpha rpredB ?Zalpha_tau // defY big_map big_seq. @@ -358,8 +367,8 @@ rewrite !cfunE 2?{1}prTIirr_id // prTIsign0 scale1r Ddelta // cfunE -mulrBr. rewrite -/rhs (cfun_on0 (seqInd_on _ Szeta)) // mulr0 subr0. rewrite (ortho_cycTIiso_vanish ctiWG) ?subr0 // -/sigma. apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i1 [j1 ->]] ->]. -rewrite defY cfdot_suml big_map big1_seq //= => psi S1psi. -by rewrite cfdotZl (coherent_ortho_cycTIiso MtypeP sS10) ?irrS1 ?mulr0. +rewrite defY linear_suml big_map big1_seq //= => psi S1psi. +by rewrite linearZl_LR /= (coherent_ortho_cycTIiso MtypeP sS10) ?irrS1 ?[_ *: _]mulr0. Qed. (* This is a specialization of the above, used in (10.5) and (10.10). *) @@ -373,15 +382,15 @@ have [[_ _ _ Nn] [[Itau1 _] _]] := (FTtype345_constants, cohS1). set Y := - (n *: _); apply: canRL (addrK _) _; set X := _ + _. have Dalpha: (alpha_ i j)^\tau = X + Y by rewrite addrK. have nY_n2: '[Y] = n ^+ 2. - by rewrite cfnormN cfnormZ norm_Cnat // Itau1 ?mem_zchar // irrWnorm ?mulr1. + by rewrite hnormN /= dnormZ /= norm_Cnat // Itau1 ?mem_zchar //= irrWnorm ?mulr1. pose S2 := zeta :: zeta^*%CF; pose S2tau1 := map tau1 S2. have S2_Y: Y \in 'Z[S2tau1] by rewrite rpredN rpredZ_Cnat ?mem_zchar ?mem_head. have sS21: {subset S2 <= calS1} by apply/allP; rewrite /= ccS1 ?S1zeta. have cohS2 : coherent_with S2 M^# tau tau1 := subset_coherent_with sS21 cohS1. have irrS2: {subset S2 <= irr M} by apply/allP; rewrite /= cfAut_irr irr_zeta. rewrite (FTtype345_bridge_coherence cohS2 Dalpha) //; last first. - rewrite -[X]opprK cfdotNr opprD cfdotDr nY_n2 cfdotNl cfdotNr opprK cfdotZl. - by rewrite cfdotC alpha_zeta_n rmorphN conj_Cnat // mulrN addNr oppr0. + rewrite -[X]opprK linearNr opprD linearDr /= nY_n2 linearNl linearNr opprK linearZl_LR /=. + by rewrite cfdotC alpha_zeta_n rmorphN conj_Cnat // [_ *: - _] mulrN addNr oppr0. split=> [|_ /sS21/sS10//|]; last first. by apply/allP; rewrite /= !inE cfConjCK !eqxx orbT. by rewrite /= inE eq_sym; have [[_ /hasPn-> //]] := scohS0; apply: sS10. @@ -416,9 +425,9 @@ have al_ij_zeta_s: '[al_ij^\tau, zeta^*^\tau1] = a. apply: canRL (addNKr _) _; rewrite addrC -opprB -cfdotBr -raddfB. have M'dz: zeta - zeta^*%CF \in 'Z[calS, M'^#] by apply: seqInd_sub_aut_zchar. rewrite Dtau1 // Dade_isometry ?alpha_on ?tauM' //. - rewrite cfdotBr opprB cfdotBl cfdot_conjCr rmorphB linearZ /=. - rewrite -!prTIirr_aut !cfdotBl !cfdotZl !o_mu2_zeta o_zeta_s !mulr0. - by rewrite opprB !(subr0, rmorph0) add0r irrWnorm ?mulr1. + rewrite linearBr opprB linearBl /= cfdot_conjCr rmorphB linearZ /=. + rewrite -!prTIirr_aut !linearBl !linearZl_LR /= !o_mu2_zeta o_zeta_s ![_ *: _]mulr0. + by rewrite opprB !(subr0, rmorph0) add0r irrWnorm ?[_ *: _]mulr1. have Zal_ij: al_ij^\tau \in 'Z[irr G] by apply: Zalpha_tau. have Za: a \in Cint. by rewrite rpredD ?(Cint_Cnat Nn) ?Cint_cfdot_vchar ?Ztau1 ?(mem_zchar Szeta). @@ -430,15 +439,15 @@ have{al_ij_zeta_s} ub_da2: (d ^ 2)%:R * a ^+ 2 <= (2%:R + n ^+ 2) * w1%:R. by rewrite (prTIred_1 pddM) mu1 // mulrC -natrM. rewrite natrX -exprMn; have <-: '[al_ij^\tau, (mu_ k)^\tau1] = d%:R * a. rewrite mulrDr mulr_natl -raddfMn /=; apply: canRL (addNKr _) _. - rewrite addrC -cfdotBr -raddfMn -raddfB -scaler_nat. - rewrite Dtau1 ?Dade_isometry ?alpha_on ?tauM' ?ZmuBzeta // cfdotBr cfdotZr. - rewrite rmorph_nat !cfdotBl !cfdotZl !o_mu2_zeta irrWnorm //. - rewrite !(cfdot_prTIirr_red pddM) cfdotC o_mu_zeta conjC0 !mulr0 mulr1. - by rewrite 2![_ == k](negPf _) 1?eq_sym // mulr0 -mulrN opprB !subr0 add0r. + rewrite addrC -linearBr -raddfMn -raddfB -scaler_nat. + rewrite /= Dtau1 ?Dade_isometry ?alpha_on ?tauM' ?ZmuBzeta // linearBr linearZ /=. + rewrite rmorph_nat !linearBl !linearZl_LR /= !o_mu2_zeta irrWnorm //. + rewrite !(cfdot_prTIirr_red pddM) cfdotC o_mu_zeta conjC0 2![_ == k](negPf _) 1?eq_sym // . + by rewrite ![_ *: _]mulr0 [_ *: _]mulr1 -mulrN opprB !subr0 add0r. have ZSmuk: mu_ k \in 'Z[calS] by rewrite mem_zchar ?calSmu. have <-: '[al_ij^\tau] * '[(mu_ k)^\tau1] = (2%:R + n ^+ 2) * w1%:R. - by rewrite Itau1 // cfdot_prTIred eqxx mul1n norm_alpha. - by rewrite -Cint_normK ?cfCauchySchwarz // Cint_cfdot_vchar // Ztau1. + by rewrite Itau1 //= cfdot_prTIred eqxx mul1n norm_alpha. + by rewrite -Cint_normK ?CauchySchwarz // Cint_cfdot_vchar // Ztau1. suffices a0 : a = 0. by apply: (def_tau_alpha _ sSS0); rewrite // -sub0r -a0 addrK. apply: contraTeq (d_gt1) => /(sqr_Cint_ge1 Za) a2_ge1. @@ -478,22 +487,22 @@ have eta_mu i: '[delta *: (eta_ i j - eta_ i 0), (mu_ j)^\tau1] = 1. have Szeta_s: zeta^*%CF \in calS by rewrite cfAut_seqInd. have o_zeta_s_w k: '[eta_ i k, d%:R *: zeta^*^\tau1] = 0. have o_S_eta_ := coherent_ortho_cycTIiso MtypeP sSS0 cohS. - by rewrite cfdotZr cfdotC o_S_eta_ ?conjC0 ?mulr0 // cfAut_irr. + by rewrite linearZ /= cfdotC o_S_eta_ ?conjC0 ?mulr0 // cfAut_irr. pose psi := mu_ j - d%:R *: zeta^*%CF; rewrite (canRL (subrK _) (erefl psi)). - rewrite (raddfD tau1) raddfZnat cfdotDr addrC cfdotZl cfdotBl !{}o_zeta_s_w. - rewrite subr0 mulr0 add0r -(canLR (subrK _) (tau_alpha i nz_j)). + rewrite (raddfD tau1) raddfZnat linearDr addrC linearZl_LR linearBl /= !{}o_zeta_s_w. + rewrite subr0 [_ *: _]mulr0 add0r -(canLR (subrK _) (tau_alpha i nz_j)). have Zpsi: psi \in 'Z[calS, M'^#]. by rewrite ZmuBzeta // cfunE zeta1w1 rmorph_nat. - rewrite cfdotDl cfdotZl Itau1 ?(zcharW Zpsi) ?mem_zchar // -cfdotZl Dtau1 //. - rewrite Dade_isometry ?alpha_on ?tauM' {Zpsi}// -cfdotDl cfdotBr cfdotZr. - rewrite subrK !cfdotBl !cfdotZl !cfdot_prTIirr_red eq_sym (negPf nz_j). - by rewrite !o_mu2_irr ?cfAut_irr // !(mulr0, subr0) eqxx. + rewrite linearDl linearZl_LR /= Itau1 ?(zcharW Zpsi) ?mem_zchar // -linearZl_LR Dtau1 //. + rewrite Dade_isometry ?alpha_on ?tauM' {Zpsi}// -linearDl linearBr linearZ /=. + rewrite subrK !linearBl !linearZl_LR /= !cfdot_prTIirr_red eq_sym (negPf nz_j). + by rewrite !o_mu2_irr ?cfAut_irr // [_ *:_]mulr0 !(mulr0, subr0) eqxx. have [_ Ddel _ _] := FTtype345_constants. have [[d1 k] Dtau1mu] := FTtypeP_coherent_TIred sSS0 cohS irr_zeta Szeta Smu_j. case=> [[Dd1 Dk] | [_ Dk _]]; first by rewrite Dtau1mu Dd1 Dk [_ ^+ _]Ddel. -have /esym/eqP/idPn[] := eta_mu 0; rewrite Dtau1mu Dk /= cfdotZl cfdotZr. -rewrite cfdot_sumr big1 ?mulr0 ?oner_eq0 // => i _; rewrite -/sigma -/(w_ i _). -rewrite cfdotBl !(cfdot_cycTIiso pddM) !(eq_sym 0) conjC_Iirr_eq0 -!irr_eq1. +have /esym/eqP/idPn[] := eta_mu 0; rewrite Dtau1mu Dk /= linearZl_LR linearZr_LR /=. +rewrite linear_sumr /= big1 ?mulr0 ?[_ *:_]mulr0 ?oner_eq0 // => i _; rewrite -/sigma -/(w_ i _). +rewrite linearBl /= !(cfdot_cycTIiso pddM) !(eq_sym 0) conjC_Iirr_eq0 -!irr_eq1. rewrite (eq_sym j) -(inj_eq irr_inj) conjC_IirrE. by rewrite odd_eq_conj_irr1 ?mFT_odd ?subrr. Qed. @@ -631,14 +640,14 @@ have Tbeta: beta \in 'Z[T2, S^#]. by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE nu_r_1 subrr. have /eqP/idPn[] := oST _ _ Salpha (zchar_subset sT2T Tbeta). have [[_ <- //] [_ <- //]] := (cohS, cohT2). -rewrite !raddfB raddfZnat /= subr_eq0 !cfdotBl !cfdotZl. +rewrite !raddfB raddfZnat /= subr_eq0 !linearBl !linearZl_LR. have [|[dr r'] -> _] := FTtypeP_coherent_TIred _ cohT2 lam_irr T2lam T2nu_r. by rewrite -DcalTs. set sigS := cyclicTIiso _ => /=. have etaC i j: sigS (cyclicTIirr xdefW j i) = eta_ i j by apply: cycTIisoC. -rewrite !cfdotZr addrC cfdot_sumr big1 => [|j _]; last first. +rewrite !linearZr_LR /= addrC linear_sumr /= big1 => [|j _]; last first. by rewrite etaC (coherent_ortho_cycTIiso _ sSS0) ?mem_irr. -rewrite !mulr0 oppr0 add0r rmorph_sign. +rewrite mulr0 [_ *: _]mulr0 oppr0 add0r rmorph_sign. have ->: '[zeta^\tau1, tau2 lambda] = 0. pose X1 := (zeta :: zeta^*)%CF; pose X2 := (lambda :: lambda^*)%CF. pose Y1 := map tau1 X1; pose Y2 := map tau2 X2; have [_ _ ccS] := sSS0. @@ -648,7 +657,7 @@ have ->: '[zeta^\tau1, tau2 lambda] = 0. have [/(sub_iso_to (zchar_subset sX2T) sub_refl)[Itau2 Ztau2] Dtau2] := cohT2. have Z_Y12: {subset Y1 <= 'Z[irr G]} /\ {subset Y2 <= 'Z[irr G]}. by rewrite /Y1 /Y2; split=> ? /mapP[xi /mem_zchar] => [/Ztau1|/Ztau2] ? ->. - have o1Y12: orthonormal Y1 && orthonormal Y2. + have o1Y12: orthonormal Y1 && orthonormal Y2. rewrite !map_orthonormal //. by apply: seqInd_conjC_ortho2 Tlam; rewrite ?gFnormal ?mFT_odd. by apply: seqInd_conjC_ortho2 Szeta; rewrite ?gFnormal ?mFT_odd ?mem_irr. @@ -660,14 +669,14 @@ have ->: '[zeta^\tau1, tau2 lambda] = 0. by move=> xi /sT2T/seqInd_vcharW. by rewrite Dtau1L // Dtau2 // !Dade1 oST ?(zchar_subset sT2T) ?eqxx. have [[ds s'] /= -> _] := FTtypeP_coherent_TIred sSS0 cohS irr_zeta Szeta Smu_s. -rewrite mulr0 subr0 !cfdotZl mulrA -signr_addb !cfdot_suml. -rewrite (bigD1 r') //= cfdot_sumr (bigD1 s') //=. +rewrite [d%:R *: _]mulr0 subr0 !linearZl_LR mulrA -signr_addb !linear_suml. +rewrite (bigD1 r') //= linear_sumr (bigD1 s') //=. rewrite etaC cfdot_cycTIiso !eqxx big1 => [|j ne_s'_j]; last first. by rewrite etaC cfdot_cycTIiso andbC eq_sym (negPf ne_s'_j). rewrite big1 => [|i ne_i_r']; last first. - rewrite cfdot_sumr big1 // => j _. - by rewrite etaC cfdot_cycTIiso (negPf ne_i_r'). -rewrite !addr0 mulr1 big1 ?mulr0 ?signr_eq0 // => i _. + rewrite linear_sumr big1 // => j _. + by rewrite etaC /= cfdot_cycTIiso (negPf ne_i_r'). +rewrite !addr0 mulr1 big1 ?[_ *:_]mulr0 ?signr_eq0 // => i _. by rewrite -etaC cfdotC (coherent_ortho_cycTIiso _ _ cohT2) ?conjC0 -?DcalTs. Qed. @@ -688,7 +697,7 @@ have Suzuki: + '[rho chi] - #|'A(M)|%:R / #|M|%:R <= 0. - pose A_ (_ : 'I_1) := ddAM; pose Atau i := Dade_support (A_ i). have tiA i j : i != j -> [disjoint Atau i & Atau j] by rewrite !ord1. - have Nchi1: '[chi] = 1 by have [[->]] := cohS; rewrite ?mem_zchar ?irrWnorm. + have Nchi1: '[chi] = 1 by have [[->]] := cohS; rewrite /= ?mem_zchar ?irrWnorm. have:= Dade_cover_inequality tiA Nchi1; rewrite /= !big_ord1 -/rho -addrA. by congr (_ * _ + _ <= 0); rewrite FT_Dade_supportE setTD. have{Suzuki} ub_rho: '[rho chi] <= #|'A(M)|%:R / #|M|%:R + #|G1|%:R / #|G|%:R. @@ -807,14 +816,14 @@ Lemma FTtype345_Dade_bridge0 : Proof. move=> w1_lt_w2; set psi := mu_ 0 - zeta; pose Wsig := map sigma (irr W). have [X wsigX [chi [DpsiG _ o_chiW]]] := orthogonal_split Wsig psi^\tau. -exists (- chi); rewrite opprK rpredN cfnormN. +exists (- chi); rewrite opprK rpredN hnormN /=. have o_chi_w i j: '[chi, eta_ i j] = 0. - by rewrite (orthoPl o_chiW) ?map_f ?mem_irr. + by rewrite (orthoPl _ _ _ o_chiW) ?map_f ?mem_irr. have [Isigma Zsigma] := cycTI_Zisometry ctiWG. have o1Wsig: orthonormal Wsig by rewrite map_orthonormal ?irr_orthonormal. have [a_ Da defX] := orthonormal_span o1Wsig wsigX. have{Da} Da i j: a_ (eta_ i j) = '[psi^\tau, eta_ i j]. - by rewrite DpsiG cfdotDl o_chi_w addr0 Da. + by rewrite DpsiG linearDl /= o_chi_w addr0 Da. have sumX: X = \sum_i \sum_j a_ (eta_ i j) *: eta_ i j. rewrite pair_bigA defX big_map (big_nth 0) size_tuple big_mkord /=. rewrite (reindex (dprod_Iirr defW)) /=. @@ -830,9 +839,9 @@ have a_00: a_ (eta_ 0 0) = 1. rewrite Da [w_ 0 0](cycTIirr00 defW) [sigma 1]cycTIiso1. rewrite Dade_reciprocity // => [|x _ y _]; last by rewrite !cfun1E !inE. rewrite rmorph1 /= -(prTIirr00 ptiWM) -/(mu2_ 0 0) cfdotC. - by rewrite cfdotBr o_mu2_zeta subr0 cfdot_prTIirr_red rmorph1. + by rewrite linearBr /= o_mu2_zeta subr0 cfdot_prTIirr_red rmorph1. have n2psiG: '[psi^\tau] = w1.+1%:R. - rewrite Dade_isometry // cfnormBd ?o_mu_zeta //. + rewrite Dade_isometry // hnormBd /= ?o_mu_zeta //. by rewrite cfnorm_prTIred irrWnorm // -/w1 mulrSr. have psiG_V0 x: x \in V -> psi^\tau x = 0. move=> Vx; rewrite Dade_id ?defA0; last first. @@ -843,7 +852,7 @@ have psiG_V0 x: x \in V -> psi^\tau x = 0. have ZpsiG: psi^\tau \in 'Z[irr G]. by rewrite Dade_vchar // zchar_split (zcharW M'psi). have n2psiGsum: '[psi^\tau] = \sum_i \sum_j `|a_ (eta_ i j)| ^+ 2 + '[chi]. - rewrite DpsiG addrC cfnormDd; last first. + rewrite DpsiG addrC hnormDd /=; last first. by rewrite (span_orthogonal o_chiW) ?memv_span1. rewrite addrC defX cfnorm_sum_orthonormal // big_map pair_bigA; congr (_ + _). rewrite big_tuple /= (reindex (dprod_Iirr defW)) //. @@ -864,7 +873,7 @@ have [a_i|a_j] := small_cycTI_NC psiG_V0 NCpsiG nz_psiG00. rewrite DpsiG sumX; congr (_ + _); apply: eq_bigr => i _. rewrite big_ord_recl /= Da a_i -Da a_00 mul1r scale1r. by rewrite big1 ?addr0 // => j1 _; rewrite Da a_i mul0r scale0r. - split=> // [||i j]; last by rewrite cfdotNl o_chi_w oppr0. + split=> // [||i j]; last by rewrite linearNl /= o_chi_w oppr0. rewrite -(canLR (addKr _) psiGi) rpredD // rpredN rpred_sum // => j _. by rewrite Zsigma ?irr_vchar. apply: (addrI w1%:R); rewrite -mulrSr -n2psiG n2psiGsum; congr (_ + _). @@ -1049,33 +1058,33 @@ have Dalpha i (al_ij := alpha_ i j) : - have [Y S1_Y [X [Dal_ij _ oXY]]] := orthogonal_split (map tau1 S1) al_ij^\tau. have [a_ Da_ defY] := orthonormal_span o1S1tau S1_Y. have oXS1 lam : lam \in S1 -> '[X, tau1 lam] = 0. - by move=> S1lam; rewrite (orthoPl oXY) ?map_f. + by move=> S1lam; rewrite (orthoPl _ _ _ oXY) ?map_f. have{Da_} Da_ lam : lam \in S1 -> a_ (tau1 lam) = '[al_ij^\tau, tau1 lam]. - by move=> S1lam; rewrite Dal_ij cfdotDl oXS1 // addr0 Da_. - pose a := n + a_ (tau1 zeta); have [_ oS1S1] := orthonormalP o1S1. + by move=> S1lam; rewrite Dal_ij linearDl /= oXS1 // addr0 Da_. + pose a := n + a_ (tau1 zeta); have [_ oS1S1] := orthonormalP _ o1S1. have Da_z: a_ (tau1 zeta) = - n + a by rewrite addKr. have Za: a \in Cint. rewrite rpredD ?Dn ?rpred_nat // Da_ // Cint_cfdot_vchar ?Zalpha_tau //=. by rewrite Ztau1 ?mem_zchar. have Da_z' lam: lam \in S1 -> lam != zeta -> a_ (tau1 lam) = a. move=> S1lam zeta'lam; apply: canRL (subrK _) _. - rewrite !Da_ // -cfdotBr -raddfB. + rewrite !Da_ // -linearBr -raddfB. have S1dlam: lam - zeta \in 'Z[S1, M^#]. by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE !S1w1 ?subrr. - rewrite Dtau1 // Dade_isometry ?alpha_on ?tauM' //; last first. + rewrite Dtau1 //= Dade_isometry ?alpha_on ?tauM' //; last first. by rewrite -zcharD1_seqInd ?(zchar_subset sS1S). have o_mu2_lam k: '[mu2_ i k, lam] = 0 by rewrite o_mu2_irr ?sS1S ?irrS1. - rewrite !cfdotBl !cfdotZl !cfdotBr !o_mu2_lam !o_mu2_zeta !(subr0, mulr0). + rewrite !linearBl !linearZl_LR !linearBr /= !o_mu2_lam !o_mu2_zeta !(subr0, mulr0). by rewrite irrWnorm ?oS1S1 // eq_sym (negPf zeta'lam) !add0r mulrN1 opprK. have lb_n2alij: (a - n) ^+ 2 + (size S1 - 1)%:R * a ^+ 2 <= '[al_ij^\tau]. - rewrite Dal_ij cfnormDd; last first. + rewrite Dal_ij hnormDd /=; last first. by rewrite cfdotC (span_orthogonal oXY) ?rmorph0 // memv_span1. - rewrite ler_paddr ?cfnorm_ge0 // defY cfnorm_sum_orthonormal //. - rewrite (big_rem (tau1 zeta)) ?map_f //= ler_eqVlt; apply/predU1P; left. + rewrite ler_paddr /= ?cfnorm_ge0 // defY cfnorm_sum_orthonormal //. + rewrite (big_rem (tau1 zeta)) /= ?map_f //= ler_eqVlt; apply/predU1P; left. congr (_ + _). by rewrite Da_z addrC Cint_normK 1?rpredD // rpredN Dn rpred_nat. rewrite (eq_big_seq (fun _ => a ^+ 2)) => [|tau1lam]; last first. - rewrite rem_filter ?free_uniq ?orthonormal_free // filter_map. + rewrite rem_filter ?free_uniq ?(@orthonormal_free _ _ [dot of @cfdot _ _]) // filter_map. case/mapP=> lam; rewrite mem_filter /= andbC => /andP[S1lam]. rewrite (inj_in_eq (Zisometry_inj Itau1)) ?mem_zchar // => zeta'lam ->. by rewrite Da_z' // Cint_normK. @@ -1117,15 +1126,15 @@ have Dmu0zeta: (mu_ 0 - zeta)^\tau = \sum_i eta_ i 0 - tau1 zeta. have dirr_zeta: tau1 zeta \in dirr G. by rewrite dirrE Ztau1 ?Itau1 ?mem_zchar //= irrWnorm. have: '[(alpha_ 0 j)^\tau, (mu_ 0 - zeta)^\tau] == - delta + n. - rewrite Dade_isometry ?alpha_on // !cfdotBl !cfdotZl !cfdotBr. + rewrite Dade_isometry ?alpha_on // !linearBl !linearZl_LR !linearBr /=. rewrite !o_mu2_zeta 2!cfdot_prTIirr_red (negPf nz_j) cfdotC o_mu_zeta. by rewrite eqxx irrWnorm // conjC0 !(subr0, add0r) mulr1 mulrN1 opprK. - rewrite Dalpha // Dmu0 !{1}(cfdotBl, cfdotZl) !cfdotBr 2!{1}(cfdotC _ chi). - rewrite !o_chi_w conjC0 !cfdot_sumr big1 => [|i]; first last. - by rewrite (cfdot_cycTIiso pddM) (negPf nz_j) andbF. + rewrite Dalpha // Dmu0 !{1}(linearBl, linearZl_LR) !linearBr /= 2!{1}(cfdotC _ chi). + rewrite !o_chi_w conjC0 !linear_sumr big1 => [|i]; first last. + by rewrite /= (cfdot_cycTIiso pddM) (negPf nz_j) andbF. rewrite (bigD1 0) //= cfdot_cycTIiso big1 => [|i nz_i]; first last. by rewrite cfdot_cycTIiso eq_sym (negPf nz_i). - rewrite big1 // !subr0 !add0r addr0 mulrN1 mulrN opprK (can_eq (addKr _)). + rewrite big1 // !subr0 !add0r addr0 [_ *:_]mulrN1 [_ *:_]mulrN opprK (can_eq (addKr _)). rewrite {2}Dn -mulr_natl Dn (inj_eq (mulfI _)) ?pnatr_eq0 //. by rewrite cfdot_dirr_eq1 // => /eqP->. have [] := uniform_prTIred_coherent pddM nz_j; rewrite -/sigma. diff --git a/theories/PFsection11.v b/theories/PFsection11.v index e8bd97b..2fd2098 100644 --- a/theories/PFsection11.v +++ b/theories/PFsection11.v @@ -16,7 +16,7 @@ Require Import matrix mxalgebra mxrepresentation mxabelem vector. From odd_order Require Import BGsection1 BGsection3 BGsection7 BGsection15 BGsection16. From mathcomp -Require Import ssrnum ssrint algC classfun character inertia vcharacter. +Require Import ssrnum ssrint algC forms classfun character inertia vcharacter. From odd_order Require Import PFsection1 PFsection2 PFsection3 PFsection4 PFsection5. From odd_order @@ -35,6 +35,14 @@ Import GroupScope GRing.Theory FinRing.Theory Num.Theory. Section Eleven. +Notation pairwise_orthogonal := (pairwise_orthogonal [hermitian of @cfdot _ _]). +Notation pairwise_orthogonalP := (pairwise_orthogonalP [dot of @cfdot _ _]). +Notation orthogonal := (orthogonal [hermitian of @cfdot _ _]). +Notation orthogonalP := (orthogonalP [hermitian of @cfdot _ _]). +Notation orthonormal := (orthonormal [hermitian of @cfdot _ _]). +Notation orthonormalP := (orthonormalP [dot of @cfdot _ _]). +Notation orthogonal_split := (orthogonal_split [dot of @cfdot _ _]). + (* This is Peterfalvi (11.1). *) Lemma lbound_expn_odd_prime p q : odd p -> odd q -> prime p -> prime q -> p != q -> 4 * q ^ 2 + 1 < p ^ q. @@ -579,7 +587,7 @@ Let bridge0 zeta := mu_ 0 - zeta. Let proj_col_eta j0 i j : '[eta_col j0, eta_ i j] = (j == j0)%:R. Proof. -rewrite cfdot_suml (bigD1 i) //= cfdot_cycTIiso eqxx eq_sym. +rewrite linear_suml (bigD1 i) //= cfdot_cycTIiso eqxx eq_sym. by rewrite big1 ?addr0 // => k /negPf-i'k; rewrite cfdot_cycTIiso i'k. Qed. @@ -640,7 +648,7 @@ Let Tmu j : mu_ j \in calT. Proof. by rewrite -cfInd_prTIres mem_seqIndT. Qed. Let omuS1 j : {in S1, forall zeta, '[mu_ j, zeta] = 0}. Proof. -by move=> zeta S1zeta /=; rewrite cfdot_suml big1 // => i _; apply: omu2S1. +by move=> zeta S1zeta /=; rewrite linear_suml big1 // => i _; apply: omu2S1. Qed. Let Zbridge0 : {in S1, forall zeta, bridge0 zeta \in 'Z[irr M, HU^#]}. @@ -771,24 +779,24 @@ without loss Dpsi: tau1 coh_tau1 @zeta1 / psi = eta_col 0 - zeta1. rewrite Dade_vchar // zchar_split A0bridge0 //. by rewrite rpredB ?char_vchar ?prTIred_char ?irrWchar. apply: (addrI q%:R); transitivity '[psi]; last first. - rewrite Dade_isometry ?A0bridge0 // (cfnormBd (omuS1 _ _)) //. + rewrite Dade_isometry ?A0bridge0 // (hnormBd (omuS1 _ _)) //=. by rewrite cfnorm_prTIred n1S1. - rewrite Dpsi [RHS]cfnormDd; last first. - rewrite opprB cfdotC cfdot_sumr big1 ?conjC0 // => i _. - by rewrite (orthoPl proj_psi_eta) ?map_f ?mem_irr. - rewrite cfnormN -nirrW1 -sumr_const cfdot_sumr. + rewrite Dpsi [RHS]hnormDd; last first. + rewrite /= opprB cfdotC linear_sumr /= big1 ?conjC0 // => i _. + by rewrite (orthoPl _ _ _ proj_psi_eta) ?map_f ?mem_irr. + rewrite hnormN -nirrW1 -sumr_const linear_sumr /=. by congr (_ + _); apply: eq_bigr => i _; rewrite proj_col_eta. have Dchi: {in S1, forall xi, xi != zeta -> chi = - tau1 xi}. move=> xi S1xi /negPf-zeta'xi; have irr_xi := irrS1 S1xi. suffices: '[zeta1 - tau1 xi, chi] = 1. by case/cfdot_add_dirr_eq1; rewrite ?rpredN ?tau1_dirr. - rewrite /= cfdotBr cfdot_sumr big1 => [|i _]; last first. + rewrite /= linearBr linear_sumr big1 => [|i _] /= ; last first. have oS1eta := coherent_ortho_cycTIiso MtypeP sS10 coh_tau1. - by rewrite cfdotBl !oS1eta ?irrS1 ?subrr. + by rewrite linearBl /= !oS1eta ?irrS1 ?subrr. rewrite -raddfB Dtau1 ?Zzeta_S1 // Dade_isometry ?A0bridge0 //; last first. exact: cfun_onS sHU_A0 (zcharD1_seqInd_on _ (Zzeta_S1 xi S1xi)). - rewrite cfdotBr cfdotC cfdotBr 2?omuS1 // subrr conjC0 !sub0r opprK. - by rewrite cfdotBl n1S1 // cfdotS1 // zeta'xi subr0. + rewrite linearBr /= cfdotC linearBr /= 2?omuS1 // subrr conjC0 !sub0r opprK. + by rewrite linearBl /= n1S1 // cfdotS1 // zeta'xi subr0. have S1zetaC: zeta^*%CF \in S1 by rewrite cfAut_seqInd. have Dchi_zetaC: chi = - tau1 zeta^*%CF. by rewrite -Dchi ?(seqInd_conjC_neq _ _ _ S1zeta) ?mFT_odd. @@ -808,8 +816,8 @@ pose alpha_ := FTtype345_bridge MtypeP zeta. have A0alpha i j : j != 0 -> alpha_ i j \in 'CF(M, 'A0(M)). by move/supp_FTtype345_bridge->; rewrite ?S1_1. have alpha_S1 i j: {in S1, forall xi, '[alpha_ i j, xi] = n *- (xi == zeta)}. - move=> xi S1xi; rewrite /= !cfdotBl !cfdotZl !omu2S1 // mulr0 subrr add0r. - by rewrite cfdotS1 // eq_sym mulr_natr. + move=> xi S1xi; rewrite /= !linearBl !linearZl_LR /= !omu2S1 // [_ *: _]mulr0 subrr add0r. + by rewrite cfdotS1 // eq_sym [_ *: _]mulr_natr. pose beta_ i j := tau (alpha_ i j) - (eta_ i j - eta_ i 0) + n *: zeta1. pose beta := beta_ 0 j1. (* This is the first part of (11.8.3). *) @@ -843,7 +851,7 @@ have tau_alpha i: tau (alpha_ i j) = eta_ i j - eta_ i 0 - n *: zeta1. have [a Za defY]: exists2 a, a \in Cint & Y = a *: sum_tau1 - n *: zeta1. have [a_ Da defY] := orthonormal_span (map_orthonormal Itau1 o1S1) S1_Y. have{Da} Da: {in S1, forall xi, a_ (tau1 xi) = '[phi, tau1 xi]}. - by move=> xi Sxi; rewrite Da Dphi cfdotDl (orthoPl oXS1) ?map_f ?addr0. + by move=> xi Sxi; rewrite Da Dphi linearDl /= (orthoPl _ _ _ oXS1) ?map_f ?addr0. exists (a_ (tau1 zeta) + n). by rewrite Dn rpredD ?rpred_nat // Da // Cint_cfdot_vchar ?Ztau1 ?Z_S1. rewrite defY big_map scaler_sumr !(bigD1_seq _ S1zeta) ?seqInd_uniq //=. @@ -852,26 +860,26 @@ have tau_alpha i: tau (alpha_ i j) = eta_ i j - eta_ i 0 - n *: zeta1. apply: canRL (addNKr _) _; rewrite addrC -opprB -!raddfB Dtau1 ?Zzeta_S1//=. rewrite Dade_isometry //; last first. exact: cfun_onS (zcharD1_seqInd_on _ (Zzeta_S1 _ S1xi)). - by rewrite cfdotBr !alpha_S1 // !mulrb eqxx ifN_eq // !(addr0, opprK). + by rewrite linearBr /= !alpha_S1 // !mulrb eqxx ifN_eq // !(addr0, opprK). have psi_phi: '[psi, phi] = -1 + n. (* This is part of (11.8.5). *) rewrite cfdotC Dade_isometry ?A0bridge0 //. - rewrite cfdotBr !cfdotBl deltaZ !cfdotZl n1S1 // mulr1. + rewrite linearBr !linearBl deltaZ !linearZl_LR /= n1S1 // mulr1. rewrite !cfdot_prTIirr_red (negPf nz_j1) eqxx !omu2S1 //= cfdotC omuS1 //. by rewrite conjC0 mulr0 opprB !subr0 add0r rmorphD rmorphN Dn !rmorph_nat. have{psi_phi} col0_beta: '[eta_col 0, beta] = a. (* Also part of (11.8.5). *) apply/(addIr (-1 + n))/(canRL (addNKr _)). - rewrite addrCA addrA addrACA -{}psi_phi Dpsi cfdotBl; congr (_ + _). - rewrite -(betaE i j) // cfdotDr !cfdotBr -/phi cfdotZr -!addrA. - apply/(canLR (addNKr _)); rewrite addNr !cfdot_suml. + rewrite addrCA addrA addrACA -{}psi_phi Dpsi linearBl /=; congr (_ + _). + rewrite -(betaE i j) // linearDr !linearBr -/phi linearZr_LR /= -!addrA. + apply/(canLR (addNKr _)); rewrite addNr !linear_suml /=. rewrite big1 ?add0r ?opprK => [|k _]; last first. by rewrite cfdot_cycTIiso andbC eq_sym (negPf nz_j1). rewrite addrCA big1 ?mulr0 ?add0r => [|k _]; last first. by rewrite cfdotC oS1eta ?conjC0. rewrite addrC (bigD1 i) // cfnorm_cycTIiso /= addKr big1 // => k i'k. by rewrite cfdot_cycTIiso (negPf i'k). - rewrite cfdotC Dphi cfdotDl (orthoPl oXS1) ?map_f // addr0. - rewrite defY cfdotBl scaler_sumr cfproj_sum_orthonormal //. - rewrite cfdotZl Itau1 ?mem_zchar ?n1S1 // mulr1 rmorphB opprD opprK. + rewrite cfdotC Dphi linearDl /= (orthoPl _ _ _ oXS1) ?map_f // addr0. + rewrite defY linearBl /= scaler_sumr cfproj_sum_orthonormal //. + rewrite linearZl_LR /= Itau1 ?mem_zchar /= ?n1S1 // [_ *:_]mulr1 rmorphB opprD opprK. by rewrite Dn rmorph_nat conj_Cint. have a_even: (2 %| a)%C. (* Third internal part of (11.8.5). *) have Zbeta: beta \in 'Z[irr G]. @@ -883,18 +891,18 @@ have tau_alpha i: tau (alpha_ i j) = eta_ i j - eta_ i 0 - n *: zeta1. rewrite rmorph_sum; apply/eq_bigr=> k _ /=. by rewrite cfAut_cycTIiso -cycTIirr_aut aut_Iirr0. have eta00: eta_ 0 0 = 1 by rewrite cycTIirr00 cycTIiso1. - rewrite orbC cfdotDl 2!cfdotBl cfdotZl -eta00 oS1eta // mulr0 addr0. + rewrite orbC linearDl 2!linearBl linearZl_LR /= -eta00 oS1eta // [_ *:_]mulr0 addr0. rewrite opprB addrC 2!{1}cfdot_cycTIiso (negPf nz_j1) subr0 /= eta00. rewrite Dade_reciprocity // => [|x _ y _]; last by rewrite !cfun1E !inE. - rewrite cfRes_cfun1 !cfdotBl deltaZ !cfdotZl -!/(mu2_ 0 _). - rewrite -(prTIirr00 ptiWM) !cfdot_prTIirr cfdotC omu2S1 // conjC0 mulr0. + rewrite cfRes_cfun1 !linearBl deltaZ !linearZl_LR /= -!/(mu2_ 0 _). + rewrite -(prTIirr00 ptiWM) !cfdot_prTIirr cfdotC omu2S1 // conjC0 [_ *:_]mulr0. by rewrite (negPf nz_j1) add0r subr0 subrr rpred0. have nY: '[Y] = n * a * (a - 2%:R) + n ^+ 2. (* Resuming step (11.8.2). *) - rewrite defY cfnormD cfnormN !cfnormZ cfdotNr cfdotZr. - rewrite cfnorm_map_orthonormal // -Dn Itau1 ?mem_zchar ?n1S1 // mulr1. + rewrite defY hnormD /= hnormN /= !dnormZ/= linearNr /= linearZr_LR /=. + rewrite cfnorm_map_orthonormal // -Dn Itau1 ?mem_zchar /= ?n1S1 // mulr1. rewrite scaler_sumr cfproj_sum_orthonormal // rmorphN addrAC. - rewrite Dn rmorphM !Cint_normK ?rpred_nat // !rmorph_nat conj_Cint // -Dn. - by rewrite -mulr2n mulrC mulrA -mulr_natr mulNr -mulrBr. + rewrite Dn /= rmorphM !Cint_normK /= ?rpred_nat // !rmorph_nat conj_Cint // -Dn. + by rewrite expr0 mul1r -mulr2n mulrC mulrA -mulr_natr mulNr -mulrBr. have{a_even} Da: (a == 0) || (a == 2%:R). (* Second part of (11.8.2). *) suffices (b := a - 1): b ^+ 2 == 1. by rewrite -!(can_eq (subrK 1) a) add0r addrK orbC -eqf_sqr expr1n. @@ -902,7 +910,7 @@ have tau_alpha i: tau (alpha_ i j) = eta_ i j - eta_ i 0 - n *: zeta1. have: n * b ^+ 2 <= n *+ 3. have: 2%:R + n <= n *+ 3 by rewrite addrC ler_add2l ler_muln2r Dn ler1n. apply: ler_trans; rewrite sqrrB1 -mulr_natr -mulrBr mulrDr mulrA mulr1. - rewrite ler_add2r -(ler_add2r (n ^+ 2 + '[X])) !addrA -nY -cfnormDd //. + rewrite ler_add2r -(ler_add2r (n ^+ 2 + '[X])) !addrA -nY -hnormDd //=. by rewrite -Dphi norm_FTtype345_bridge ?S1_1 // ler_addl cfnorm_ge0. have Zb: b \in Cint by rewrite rpredB ?rpred1 ?Za. have nz_b: b != 0 by rewrite subr_eq0 (memPn _ a a_even) ?(dvdC_nat 2 1). @@ -918,9 +926,9 @@ have tau_alpha i: tau (alpha_ i j) = eta_ i j - eta_ i 0 - n *: zeta1. by rewrite rpredZ_Cint ?mem_zchar ?map_f. by rewrite Dn rpredZnat ?mem_zchar ?map_f. have{col0_beta} a0: a = 0. (* This is the conclusion of (11.8.5). *) - rewrite cfdot_suml big1 // in col0_beta => k _. + rewrite linear_suml big1 // in col0_beta => k _. rewrite -(betaE i j) // /beta_ -/phi Dphi -defX addrK defY subrK. - rewrite cfdotZr cfdot_sumr big1_seq ?mulr0 // => xi S1xi. + rewrite linearZr_LR /= linear_sumr big1_seq ?mulr0 //= => xi S1xi. by rewrite cfdotC oS1eta ?conjC0. by rewrite Dphi defY defX a0 ?inE ?eqxx // scale0r sub0r addrC. (* This is step (11.8.6). *) @@ -971,24 +979,24 @@ have{IHtau2} /hasP[xi S2xi /=irr_xi]: has [mem irr M] S2. suffices: '[tau2 (mu_ j), eta_col j] != 0. have:= FTtypeP_coherent_TIred sS20 coh_tau2 irr_xi S2xi S2muj. case=> _ -> [[-> ->] | [-> -> _] /eqP[]]; first by rewrite deltaZ. - rewrite -[cyclicTIiso _]/sigma cfdot_sumr big1 ?mulr0 // => i _. - rewrite cfdotZl proj_col_eta -(inj_eq irr_inj) conjC_IirrE eq_sym. - by rewrite odd_eq_conj_irr1 ?mFT_odd // irr_eq1 (negPf nz_j1) mulr0. + rewrite -[cyclicTIiso _]/sigma linear_sumr big1 ?mulr0 // => i _. + rewrite linearZl_LR /= proj_col_eta -(inj_eq irr_inj) conjC_IirrE eq_sym. + by rewrite odd_eq_conj_irr1 ?mFT_odd // irr_eq1 (negPf nz_j1) [_ *: _]mulr0. pose gamma := xi 1%g *: mu_ j - mu_ j 1%g *: xi. have: '[tau2 gamma, tau theta] != 0. have [Txi Tzeta] := (seqInd_subT S2xi, seqInd_subT S1zeta). have S2gamma: gamma \in 'Z[S2, HU^#] by apply: sub_seqInd_zchar. rewrite Dtau2 ?zcharD1_seqInd //; move/zchar_on in S2gamma. - rewrite Dade_isometry ?(cfun_onS sHU_A0) // cfdotBr cfdotZr !cfdotBl !cfdotZl. + rewrite Dade_isometry ?(cfun_onS sHU_A0) // linearBr linearZr_LR /= !linearBl !linearZl_LR /=. rewrite cfnorm_prTIred omuS1 // (seqInd_ortho _ _ S2muj) ?(memPn red_muj) //. - rewrite (seqInd_ortho _ Txi) ?(memPn (sS1S2' _)) // !(mulr0, subr0) mulf_eq0. + rewrite (seqInd_ortho _ Txi) ?(memPn (sS1S2' _)) //![_ *: 0]mulr0 !(mulr0, subr0) mulf_eq0. by rewrite char1_eq0 ?irrWchar // -cfnorm_eq0 irrWnorm ?oner_eq0 ?neq0CG. apply: contraNneq => o_muj_etaj; rewrite {}tau_theta !{gamma}raddfB subr_eq0 /=. have /CnatP[xi1 ->]: xi 1%g \in Cnat by rewrite Cnat_char1 ?irrWchar. -rewrite mu_1 // cfdotZr !cfdotBl !raddfZnat !cfdotZl {}o_muj_etaj cfdot_sumr. +rewrite mu_1 // linearZr_LR /= !linearBl !raddfZnat !linearZl_LR /= {}o_muj_etaj linear_sumr /=. have /orthogonalP oS2_S1: orthogonal (map tau2 S2) (map tau1 S1). exact: (coherent_ortho scohM) sS20 coh_tau2 sS10 coh_tau1 sS1S2'. -rewrite !oS2_S1 ?map_f // big1 ?(mulr0, subr0) // => k _. +rewrite !oS2_S1 ?map_f // big1 ?[_ *:_]mulr0 ?(mulr0, subr0) // => k _. exact: (coherent_ortho_cycTIiso _ _ coh_tau2). Qed. @@ -1016,18 +1024,18 @@ have bridgeS1: {in S1, forall zeta, eq_proj_eta (tau (bridge0 zeta)) eta0row}. have [X etaX [chi [Dchi oXchi o_chi_eta]]] := orthogonal_split etaW (tau phi). have [Isigma Zsigma] := cycTI_Zisometry ctiWG. have{o_chi_eta} o_chi_eta i j: '[chi, eta_ i j] = 0. - by rewrite (orthoPl o_chi_eta) ?map_f ?mem_irr. + by rewrite (orthoPl _ _ _ o_chi_eta) ?map_f ?mem_irr. have o1etaW: orthonormal etaW by rewrite map_orthonormal ?irr_orthonormal. have [a Da defX] := orthonormal_span o1etaW etaX; pose a_ := a (eta_ _ _). have{Da} Da i j: a_ i j = '[tau phi, eta_ i j]. - by rewrite Dchi cfdotDl o_chi_eta addr0 /a_ Da. + by rewrite Dchi linearDl /= o_chi_eta addr0 /a_ Da. have Zphi: phi \in 'Z[irr M, HU^#] by apply: Zbridge0. have A0phi: phi \in 'CF(M, 'A0(M)) by apply: A0bridge0. have a00_1 : a_ 0 0 = 1. rewrite Da cycTIirr00 [sigma 1]cycTIiso1. rewrite Dade_reciprocity // => [|x _ y _]; last by rewrite !cfun1E !inE. rewrite rmorph1 /= -(prTIirr00 ptiWM) -/(mu2_ 0 0) cfdotC. - by rewrite cfdotBr cfdot_prTIirr_red omu2S1 // subr0 rmorph1. + by rewrite linearBr /= cfdot_prTIirr_red omu2S1 // subr0 rmorph1. have aut_phi nu: cfAut nu (tau phi) = tau phi + tau (zeta - cfAut nu zeta). rewrite -Dade_aut !rmorphB !raddfB /= !addrA subrK. by rewrite -prTIred_aut aut_Iirr0. @@ -1039,8 +1047,8 @@ have bridgeS1: {in S1, forall zeta, eq_proj_eta (tau (bridge0 zeta)) eta0row}. have a_aut nu i j: a (cfAut nu (eta_ i j)) = a_ i j. symmetry; transitivity '[cfAut nu (tau phi), cfAut nu (eta_ i j)]. by rewrite cfdot_aut_vchar ?cycTIiso_vchar // -Da aut_Cint. - rewrite aut_phi cfAut_cycTIiso -cycTIirr_aut [a _]Da cfdotDl addrC. - rewrite -Dtau1 ?zcharD1_seqInd ?seqInd_sub_aut_zchar // raddfB cfdotBl. + rewrite aut_phi cfAut_cycTIiso -cycTIirr_aut [a _]Da linearDl addrC. + rewrite -Dtau1 ?zcharD1_seqInd ?seqInd_sub_aut_zchar // raddfB linearBl /=. by rewrite !o_tau1_eta ?cfAut_seqInd ?cfAut_irr // subr0 add0r. pose a10 := a_ i1 0; pose a01 := a_ 0 j1; pose a11 := a_ i1 j1. have Da10 i: i != 0 -> a_ i 0 = a10. @@ -1070,9 +1078,9 @@ have bridgeS1: {in S1, forall zeta, eq_proj_eta (tau (bridge0 zeta)) eta0row}. apply: eq_bigr => i /Da10-Dai0; rewrite (bigD1 0) //= Dai0; congr (_ + _). by apply: eq_bigr => j /Da01-Da0j; rewrite DaB1 Dai0 Da0j -DaB1. have normX_le_q: '[X] <= q%:R. - rewrite -(ler_add2r '[chi]) -cfnormDd // -Dchi -ler_subl_addl. + rewrite -(ler_add2r '[chi]) -hnormDd // -Dchi -ler_subl_addl. have ->: '[tau phi] - q%:R = 1. - rewrite Dade_isometry ?A0bridge0 // cfnormBd; last by rewrite omuS1. + rewrite Dade_isometry ?A0bridge0 // hnormBd /=; last by rewrite omuS1. by rewrite cfnorm_prTIred cfdotS1 // eqxx addrC addKr. suffices: '[chi] != 0. suffices /CnatP[nchi ->]: '[chi] \in Cnat by rewrite ler1n lt0n -eqC_nat. @@ -1084,13 +1092,13 @@ have bridgeS1: {in S1, forall zeta, eq_proj_eta (tau (bridge0 zeta)) eta0row}. have Ztheta: theta \in 'Z[S1, HU^#] by apply: seqInd_sub_aut_zchar. have: '[tau phi, tau theta] != 0. rewrite Dade_isometry //; last by rewrite (cfun_onS _ (zchar_on Ztheta)). - rewrite cfdotBl !cfdotBr ?omuS1 ?cfAut_seqInd // subr0 add0r oppr_eq0. + rewrite linearBl !linearBr /= ?omuS1 ?cfAut_seqInd // subr0 add0r oppr_eq0. rewrite irrWnorm // (seqInd_conjC_ortho _ _ _ S1zeta) ?mFT_odd //. by rewrite subr0 oner_eq0. rewrite cfnorm_eq0 Dchi; apply: contraNneq => ->; rewrite addr0 defX. rewrite -Dtau1 ?zcharD1_seqInd //. - rewrite cfdot_suml big_map big1_seq // => _ /(cycTIirrP defW)[i [j ->]]. - apply/eqP; rewrite cfdotC fmorph_eq0 cfdotZr raddfB cfdotBl. + rewrite linear_suml big_map big1_seq //= => _ /(cycTIirrP defW)[i [j ->]]. + apply/eqP; rewrite cfdotC fmorph_eq0 linearZr_LR /= raddfB linearBl /=. by rewrite !o_tau1_eta ?cfAut_seqInd ?cfAut_irr // subrr mulr0. have a2_ge0 i j: 0 <= a_ i j ^+ 2 by rewrite -realEsqr Creal_Cint. have a11_0: a11 = 0. @@ -1105,7 +1113,7 @@ have bridgeS1: {in S1, forall zeta, eq_proj_eta (tau (bridge0 zeta)) eta0row}. have a10_a01: a10 + a01 = 1. by apply/eqP; rewrite -subr_eq0 -a00_1 -DaB1 -/a11 a11_0. have{o_chi_eta} o_chi_eta: orthogonal chi etaW. - by apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i [j ->]] ->]. + by apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i [j ->]] ->] /=. have a10_0: a10 = 0. apply: contraNeq (FTtype34_not_ortho_cycTIiso S1zeta) => nz_a10. have a01_0: a01 = 0. @@ -1138,8 +1146,8 @@ have{Szeta} ltpq: (p < q)%N. rewrite ltn_neqAle neq_pq leqNgt /=. apply: contra (FTtype34_not_ortho_cycTIiso S1zeta) => ltqp. case/(FTtype345_Dade_bridge0 _ MtypeP): Szeta => // chi [-> _ _ o_chi_eta]. - rewrite /eq_proj_eta addrC addKr (orthogonal_oppl chi). - by apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i [j ->]] ->]. + rewrite /eq_proj_eta addrC addKr (orthogonal_oppl _ chi). + by apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i [j ->]] ->] /=. suffices galM: typeP_Galois MtypeP. have [_ [_ _ _ [/= cycUbar _ _]]] := typeP_Galois_P maxM notMtype5 galM. have{cycUbar} cycUbar: cyclic (U / U') by rewrite -defU' -defC. @@ -1171,19 +1179,19 @@ have o_phi_psi: '[phi, tau psi] = 0. have Apsi: psi \in 'CF(M, 'A(M)) by rewrite defA (zcharD1_seqInd_on _ S2psi). have [Tzeta Tlambda] := (seqInd_subT S1zeta, seqInd_subT S2lambda). rewrite Dade_isometry ?A0bridge0 ?(cfun_onS (FTsupp_sub0 M)) //. - rewrite cfdotBl !cfdotBr !cfdotZr cfdot_prTIred eq_sym (negPf nz_j1) add0r. + rewrite linearBl !linearBr !linearZr_LR /= cfdot_prTIred eq_sym (negPf nz_j1) add0r. rewrite !(seqInd_ortho _ Tzeta) ?Tmu ?(memPnC (sS1S2' S1zeta)) // add0r. rewrite (seqInd_ortho _ (Tmu 0)) ?(memPnC (prTIred_not_irr _ _)) // !mulr0. by rewrite subrr. have [tau2 coh_tau2] := cohS2; have [[_ Ztau2] Dtau2] := coh_tau2. have ua_1: (u %/ a)%:R * `|'[phi, tau2 lambda]| == 1. rewrite -normr_nat -normrM mulr_natl -!raddfMn -[_ *+ _](subrK (mu_ j)) /=. - rewrite -opprB addrC raddfB cfdotBr -scaler_nat (Dtau2 _ S2psi) o_phi_psi. + rewrite -opprB addrC raddfB linearBr /= -scaler_nat (Dtau2 _ S2psi) o_phi_psi. case: (FTtypeP_coherent_TIred _ coh_tau2 _ S2lambda S2muj) => // -[b k] -> _. - rewrite -/(eta_col k) cfdotZr rmorph_sign subr0 normrMsign. - rewrite -[phi](subrK eta0row) cfdotDl cfdot_sumr big1 => [|j' _]; last first. - by rewrite (orthoPl (bridgeS1 _ _)) ?map_f ?mem_irr. - rewrite add0r cfdotC norm_conjC cfdot_sumr (bigD1 k) //= proj_col_eta eqxx. + rewrite -/(eta_col k) linearZr_LR /= rmorph_sign subr0 normrMsign. + rewrite -[phi](subrK eta0row) linearDl linear_sumr /= big1 => [|j' _]; last first. + by rewrite (orthoPl _ _ _ (bridgeS1 _ _)) ?map_f ?mem_irr. + rewrite add0r cfdotC norm_conjC linear_sumr (bigD1 k) //= proj_col_eta eqxx. by rewrite big1 ?addr0 ?normr1 // => i k'i; rewrite proj_col_eta (negPf k'i). have Du: u = a. apply/eqP; rewrite -[a]mul1n eqn_mul ?(ltnW a_gt1) // -eqC_nat. diff --git a/theories/PFsection12.v b/theories/PFsection12.v index 666f882..925dbd9 100644 --- a/theories/PFsection12.v +++ b/theories/PFsection12.v @@ -22,7 +22,7 @@ Require Import BGsection14 BGsection15 BGsection16. From mathcomp Require Import ssrnum ssrint algC cyclotomic algnum. From mathcomp -Require Import classfun character inertia vcharacter. +Require Import forms classfun character inertia vcharacter. From odd_order Require Import PFsection1 PFsection2 PFsection3 PFsection4 PFsection5. From odd_order @@ -44,6 +44,14 @@ Local Notation G := (TheMinSimpleOddGroup gT). Implicit Types (p q : nat) (x y z : gT). Implicit Types H K L M N P Q R S T U V W : {group gT}. +Notation pairwise_orthogonal := (pairwise_orthogonal [hermitian of @cfdot _ _]). +Notation pairwise_orthogonalP := (pairwise_orthogonalP [dot of @cfdot _ _]). +Notation orthogonal := (orthogonal [hermitian of @cfdot _ _]). +Notation orthogonalP := (orthogonalP [hermitian of @cfdot _ _]). +Notation orthonormal := (orthonormal [hermitian of @cfdot _ _]). +Notation orthonormalP := (orthonormalP [dot of @cfdot _ _]). +Notation orthogonal_split := (orthogonal_split [dot of @cfdot _ _]). + Section Twelve2. (* Hypothesis 12.1 *) @@ -196,8 +204,8 @@ exists R; split => //= => [| i Ii]; last first. have hchi : 'chi_i \in 'Z[calI, L] by rewrite mem_zchar_on // cfun_onG. rewrite sub_aut_zchar ?cfAut_zchar // => _ /mapP[j _ ->]. exact: irr_vchar. - have [-> // _] := tau_iso; rewrite cfnormBd ?cfnorm_conjC ?cfnorm_irr //. - by have [_ ->] := pairwise_orthogonalP oI; rewrite ?ccI // eq_sym (hasPn nrI). + have [-> // _] := tau_iso; rewrite hnormBd/= ?cfnorm_conjC ?cfnorm_irr //. + by have [_ ->] := pairwise_orthogonalP _ oI; rewrite ?ccI // eq_sym (hasPn nrI). have calS_portho : pairwise_orthogonal calS by apply: seqInd_orthogonal. have calS_char : {subset calS <= character} by apply: seqInd_char. have calS_chi_ortho : @@ -263,16 +271,16 @@ case: (Rgen _ _) @R2 => /= R2; set R2' := sval _ => [[subcoh2 hR2' defR2]]. pose tau1 := FT_Dade maxL1; pose tau2 := FT_Dade maxL2. move=> chi1 chi2 calS1_chi1 calS2_chi2. have [_ _ _ /(_ chi1 calS1_chi1)[Z_R1 o1R1 dtau1_chi1] _] := subcoh1. -have{o1R1} [uR1 oR1] := orthonormalP o1R1. -apply/orthogonalP=> a b R1a R2b; pose psi2 := tau2 (chi2 - chi2^*%CF). +have{o1R1} [uR1 oR1] := orthonormalP _ o1R1. +apply/orthogonalP=> a b R1a R2b /= ; pose psi2 := tau2 (chi2 - chi2^*%CF). have Z1a: a \in dirr G by rewrite dirrE Z_R1 //= oR1 ?eqxx. suffices{b R2b}: '[a, psi2] == 0. apply: contraTeq => nz_ab; rewrite /psi2 /tau2. have [_ _ _ /(_ chi2 calS2_chi2)[Z_R2 o1R2 ->] _] := subcoh2. - suffices [e ->]: {e | a = if e then - b else b}. - rewrite -scaler_sign cfdotC cfdotZr -cfdotZl scaler_sumr. + suffices [e ->]: {e | a = if e then - b else b}. + rewrite -scaler_sign cfdotC linearZr_LR /= -linearZl_LR scaler_sumr /=. by rewrite cfproj_sum_orthonormal // conjCK signr_eq0. - have [_ oR2] := orthonormalP o1R2. + have [_ oR2] := orthonormalP _ o1R2. have Z1b: b \in dirr G by rewrite dirrE Z_R2 //= oR2 ?eqxx. move/eqP: nz_ab; rewrite cfdot_dirr //. by do 2?[case: eqP => [-> | _]]; [exists true | exists false | ]. @@ -287,15 +295,15 @@ have [t S_chi1t et]: exists2 t, t \in S_chi1 & tau1 (bchi _ t) = a - a^*%CF. exact: Dade_irr_sub_conjC (mem_irr _) (Achi1 i Si). have {1}->: bchi G k = dchi (false, k) + dchi (true, conjC_Iirr k). by rewrite /dchi !scaler_sign conjC_IirrE. - rewrite cfdotDl !cfdot_dchi addrACA -opprD subr_le0 -!natrD leC_nat. + rewrite linearDl /= !cfdot_dchi addrACA -opprD subr_le0 -!natrD leC_nat. do 2?case: (_ =P ia) => [<-|] _ //; first by rewrite /dchi scale1r. by rewrite /dchi scaleN1r conjC_IirrE rmorphN /= cfConjCK opprK addrC. have: '[tau1 (chi1 - chi1^*%CF), a] == 1. - rewrite /tau1 dtau1_chi1 (bigD1_seq a) //= cfdotDl cfdot_suml oR1 // eqxx. + rewrite /tau1 dtau1_chi1 (bigD1_seq a) //= linearDl linear_suml /= oR1 // eqxx. by rewrite big1_seq ?addr0 // => xi /andP[/negPf a'xi ?]; rewrite oR1 ?a'xi. apply: contraL => /forall_inP tau1a_le0. rewrite (ltr_eqF (ler_lt_trans _ ltr01)) // chi1D rmorph_sum /= -/S_chi1. - rewrite -sumrB [tau1 _]linear_sum /= -/tau1 cfdot_suml. + rewrite -sumrB [tau1 _]linear_sum /= -/tau1 linear_suml. by rewrite -oppr_ge0 -sumrN sumr_ge0 // => i /tau1a_le0; rewrite oppr_ge0. clear Achi1 dtau1_chi1 uR1 defR1. suffices: '[a, psi2] == - '[a, psi2] by rewrite -addr_eq0 (mulrn_eq0 _ 2). @@ -349,7 +357,7 @@ have dot_irr xi j : xi \in calS -> j \in S_ xi -> '['chi_j, xi] = 1. move=> xi_calS Sj. have -> : xi = \sum_(i <- enum (S_ xi)) 'chi_i. by rewrite big_filter; have [] := FTtype1_seqInd_facts maxL Ltype1 xi_calS. - rewrite (bigD1_seq j) ?mem_enum ?enum_uniq //= cfdotDr cfdot_sumr cfnorm_irr. + rewrite (bigD1_seq j) ?mem_enum ?enum_uniq //= linearDr linear_sumr /= cfnorm_irr. by rewrite big1 ?addr0 // => k i'k; rewrite cfdot_irr eq_sym (negPf i'k). have {dot_irr} supp12B y xi j1 j2 : xi \in calS -> j1 \in S_ xi -> j2 \in S_ xi -> y \notin ('A(L) :\: H^#) -> ('chi_j1 - 'chi_j2) y = 0. @@ -441,7 +449,7 @@ have{rR scohS opsiR} o_rpsi_S xi1 xi2: have{ccsS2S cohS2} tau2E := mem_coherent_sum_subseq scohS ccsS2S cohS2. have o_psi_tau2 xi: xi \in calS2 -> '[psi, tau2 xi] = 0. move=> S2xi; have [e /mem_subseq Re ->] := tau2E xi S2xi. - by rewrite cfdot_sumr big1_seq // => _ /Re/orthoPl->; rewrite ?opsiR ?sS2S. + by rewrite linear_sumr /= big1_seq // => _ /Re/orthoPl->; rewrite ?opsiR ?sS2S. have A1xi12: xi1 - xi2 \in 'CF(L, H^#). by rewrite (@zchar_on _ _ calS) ?zcharD1 ?rpredB ?seqInd_zchar. rewrite cfdotC -invDade_reciprocity // -cfdotC. @@ -483,10 +491,10 @@ have Ak: k \in A; last 1 [have iHk := Ak; rewrite defA inE in Ak]. have{DiH} DiH: 'Ind 'chi_i = e *: \sum_(j in A) 'chi_j. by congr (_ = _ *: _): DiH; apply: eq_bigl => j; rewrite [in RHS]defA !inE. rewrite {2}DiH; have{DiH} ->: e = '['Ind 'chi_i, 'chi_k]. - rewrite DiH cfdotZl cfdot_suml (bigD1 k) //= cfnorm_irr big1 ?addr0 ?mulr1 //. + rewrite DiH linearZl_LR linear_suml (bigD1 k) //= cfnorm_irr big1 ?addr0 ?[_%:A]mulr1 //. by move=> j /andP[_ k'j]; rewrite cfdot_irr (negPf k'j). rewrite scalerA scaler_sumr divfK //; apply: eq_bigr => j Aj; congr (_ *: _). -rewrite cfdotBl cfdotZl -irr0 cfdot_irr mulr_natr mulrb eq_sym. +rewrite cfdotBl linearZl_LR -irr0 /= cfdot_irr [_ *:_]mulr_natr mulrb eq_sym. apply/(canLR (addrK _))/(canRL (addNKr _)); rewrite addrC -cfdotBr. have [j0 | nzj] := altP eqP; first by rewrite j0 irr0 /a -j0 (def_pblock _ P_A). have iHj := Aj; rewrite defA inE in iHj; rewrite cfdot_Res_l linearB /=. @@ -992,21 +1000,21 @@ have o1calS: orthonormal calS. by rewrite (sub_orthonormal irrS) ?seqInd_uniq ?irr_orthonormal. have norm_alpha: '[tauL_H alpha] = e%:R + 1. rewrite Dade_isometry ?(cfInd1_sub_lin_on _ Schi) ?De //. - rewrite cfnormBd; last by rewrite cfdotC (seqInd_ortho_Ind1 _ _ Schi) ?conjC0. + rewrite hnormBd /=; last by rewrite cfdotC (seqInd_ortho_Ind1 _ _ Schi) ?conjC0. by rewrite cfnorm_Ind_cfun1 // De irrWnorm. pose h := #|H|; have ub_a: a ^+ 2 * ((h%:R - 1) / e%:R) - 2%:R * a <= e%:R - 1. rewrite -[h%:R - 1](mulKf (neq0CiG L H)) -sum_seqIndC1_square // De -/calS. rewrite -[lhs in lhs - 1](addrK 1) -norm_alpha -[tauL_H _](subrK 1). - rewrite cfnormDd; last by rewrite cfdotBl tau_alpha_1 cfnorm1 subrr. + rewrite hnormDd /=; last by rewrite linearBl /= tau_alpha_1 cfnorm1 subrr. rewrite cfnorm1 addrK [in '[_]]addrC {}tau_alpha -!addrA addKr addrCA addrA. - rewrite ler_subr_addr cfnormDd ?ler_paddr ?cfnorm_ge0 //; last first. - rewrite cfdotBl cfdotZl cfdot_suml (orthoPr o_tau1_Ga) ?map_f // subr0. - rewrite big1_seq ?mulr0 // => xi Sxi; rewrite cfdotZl. - by rewrite (orthoPr o_tau1_Ga) ?map_f ?mulr0. - rewrite cfnormB cfnormZ Cint_normK // cfdotZl cfproj_sum_orthonormal //. - rewrite cfnorm_sum_orthonormal // Itau1 ?mem_zchar // irrWnorm ?irrS // divr1. - rewrite chi1 divff ?neq0CG // mulr1 conj_Cint // addrAC mulr_natl. - rewrite !ler_add2r !(mulr_suml, mulr_sumr) !big_seq ler_sum // => xi Sxi. + rewrite ler_subr_addr hnormDd /= ?ler_paddr /= ?cfnorm_ge0 //; last first. + rewrite linearBl linearZl_LR /= linear_suml (orthoPr _ _ _ o_tau1_Ga) ?map_f // subr0. + rewrite big1_seq ?[_ *:_]mulr0 // => xi Sxi; rewrite linearZl_LR /=. + by rewrite (orthoPr _ _ _ o_tau1_Ga) ?map_f ?[_ *:_]mulr0. + rewrite hnormB expr0 mul1r /= dnormZ /= Cint_normK // linearZl_LR /= cfproj_sum_orthonormal //. + rewrite /= cfnorm_sum_orthonormal // Itau1 ?mem_zchar //= irrWnorm ?irrS // divr1. + rewrite chi1 divff /= ?neq0CG // [_ *: _]mulr1 conj_Cint// addrAC mulr_natl mulr2n. + rewrite !ler_add2r !(mulr_suml, mulr_sumr) !big_seq ler_sum // => xi Sxi. rewrite irrWnorm ?irrS // !divr1 (mulrAC _^-1) -expr2 -!exprMn (mulrC _^-1). by rewrite normf_div normr_nat norm_Cnat // (Cnat_seqInd1 Sxi). have [pr_p p_dv_M]: prime p /\ p %| #|M|. @@ -1055,21 +1063,21 @@ have defS1: perm_eq (seqIndT H L) (chi0 :: calS). by rewrite [calS]seqIndC1_rem // perm_to_rem ?seqIndT_Ind1. have [c _ -> // _] := invDade_seqInd_sum (FT_DadeF_hyp maxL) psi defS1. have psi_alpha_1: '[psi, tauL_H alpha] = -1. - rewrite tau_alpha a0 scale0r addr0 addrC addrA cfdotBr cfdotDr. - rewrite (orthoPr o_tau_1) ?(orthoPr o_tau1_Ga) ?map_f // !add0r. - by rewrite Itau1 ?mem_zchar ?map_f // irrWnorm ?irrS. + rewrite tau_alpha a0 scale0r addr0 addrC addrA cfdotBr linearDr /=. + rewrite /= (orthoPr _ _ _ o_tau_1) ?(orthoPr _ _ _ o_tau1_Ga) ?map_f // !add0r. + by rewrite Itau1 ?mem_zchar ?map_f //= irrWnorm ?irrS. rewrite (bigD1_seq chi) ?seqInd_uniq //= big1_seq => [|xi /andP[chi'xi Sxi]]. rewrite addr0 -cfdotC chi1 cfInd1 ?gFsub // cfun11 mulr1 De divff ?neq0CG //. - rewrite scale1r -opprB linearN cfdotNr psi_alpha_1 opprK. + rewrite scale1r -opprB linearN linearNr /= psi_alpha_1 opprK. by rewrite irrWnorm ?irrS // divr1 mul1r. rewrite -cfdotC cfInd1 ?gFsub // cfun11 mulr1. rewrite /chi0 -(canLR (subrK _) (erefl alpha)) scalerDr opprD addrCA -scaleNr. -rewrite linearD linearZ /= cfdotDr cfdotZr psi_alpha_1 mulrN1 rmorphN opprK. +rewrite linearD linearZ /= linearDr linearZr_LR /= psi_alpha_1 mulrN1 rmorphN opprK. rewrite -/tauL_H -Dtau1 ?zcharD1_seqInd ?(seqInd_sub_lin_vchar _ Schi) ?De //. -have [_ ooS] := orthonormalP o1calS. -rewrite raddfB cfdotBr Itau1 ?mem_zchar // ooS // mulrb ifN_eqC // add0r. -rewrite -De raddfZ_Cnat ?(dvd_index_seqInd1 _ Sxi) // De cfdotZr. -by rewrite Itau1 ?mem_zchar ?ooS // eqxx mulr1 subrr !mul0r. +have [_ ooS] := orthonormalP _ o1calS. +rewrite raddfB cfdotBr Itau1 /= ?mem_zchar // ooS // mulrb ifN_eqC // add0r. +rewrite -De raddfZ_Cnat ?(dvd_index_seqInd1 _ Sxi) // De linearZr_LR /=. +by rewrite Itau1 /= ?mem_zchar ?ooS // eqxx mulr1 subrr !mul0r. Qed. Let rhoM := invDade (FT_DadeF_hyp maxM). @@ -1204,7 +1212,7 @@ have tiA1_LM: [disjoint 'A1~(L) & 'A1~(M)]. by rewrite p'groupEpi (piSg sP0H) // -p_rank_gt0 prankP0. have{tiA1_LM} ub_rhoML: '[rhoM psi] + '[rhoL psi] < 1. have [[Itau1 Ztau1] _] := cohS. - have n1psi: '[psi] = 1 by rewrite Itau1 ?mem_zchar ?irrWnorm ?irrS. + have n1psi: '[psi] = 1 by rewrite Itau1 /= ?mem_zchar ?irrWnorm ?irrS. rewrite -n1psi (cfnormE (cfun_onG psi)) (big_setD1 1%g) ?group1 //=. rewrite mulrDr ltr_spaddl 1?mulr_gt0 ?invr_gt0 ?gt0CG ?exprn_gt0 //. have /dirrP[s [i ->]]: psi \in dirr G. diff --git a/theories/PFsection13.v b/theories/PFsection13.v index a9758ff..78206b6 100644 --- a/theories/PFsection13.v +++ b/theories/PFsection13.v @@ -20,7 +20,7 @@ Require Import BGsection14 BGsection15 BGsection16. From mathcomp Require Import ssrnum rat algC cyclotomic algnum. From mathcomp -Require Import classfun character integral_char inertia vcharacter. +Require Import forms classfun character integral_char inertia vcharacter. From odd_order Require Import PFsection1 PFsection2 PFsection3 PFsection4. From odd_order @@ -66,6 +66,14 @@ Local Notation G := (TheMinSimpleOddGroup gT). Implicit Types (p q : nat) (x y z : gT). Implicit Types H K L N P Q R S T U W : {group gT}. +Notation pairwise_orthogonal := (pairwise_orthogonal [hermitian of @cfdot _ _]). +Notation pairwise_orthogonalP := (pairwise_orthogonalP [dot of @cfdot _ _]). +Notation orthogonal := (orthogonal [hermitian of @cfdot _ _]). +Notation orthogonalP := (orthogonalP [hermitian of @cfdot _ _]). +Notation orthonormal := (orthonormal [hermitian of @cfdot _ _]). +Notation orthonormalP := (orthonormalP [dot of @cfdot _ _]). +Notation orthogonal_split := (orthogonal_split [dot of @cfdot _ _]). + Definition irr_Ind_Fitting S := [predI irr S & seqIndT 'F(S) S]. Local Notation irrIndH := (irr_Ind_Fitting _). @@ -387,8 +395,8 @@ exists true => // _ /defIW2/pred2P[]->; first by rewrite scaler_sign. have [[[Itau1 _] _] [d t1muk Dd]] := (cohS, tau1mu k nz_k); move: Dd t1muk. case=> [][-> ->] => [|_]; rewrite ?signrN delta1 // scale1r. case/(congr1 (cfdotr (tau1 (mu_ j)) \o -%R))/eqP/idPn => /=. -rewrite -tau1muj cfdotNl eq_sym !Itau1 ?mem_zchar ?FTseqInd_TIred //. -by rewrite !cfdot_prTIred (negPf j'k) eqxx mul1n oppr0 neq0CG. +rewrite -tau1muj linearNl /= eq_sym !Itau1 /= ?mem_zchar ?FTseqInd_TIred //. +by rewrite !cfdot_prTIred (negPf j'k) eqxx mul1n oppr0 neq0CG. Qed. (* We skip over (13.4), whose proof uses (13.2) and (13.3) for both groups of *) @@ -505,7 +513,7 @@ have{Da_} Da_ zeta: zeta \in calS1 -> a_ zeta = '[tau1 zeta, chi]. move=> S1zeta; have Hzeta := sS1H _ S1zeta. rewrite Da_ //; have [_ _ _ _ [_ <-]] := FTtypeP_facts. rewrite -Dtau1; last by rewrite zcharD1E rpredB ?sS1S ?dH_1. - by rewrite raddfB cfdotBl (o_tau1S_chi zeta0) ?subr0. + by rewrite raddfB linearBl /= (o_tau1S_chi zeta0) ?subr0. by rewrite (cfun_onS (Fitting_sub_FTsupp0 maxS)) ?H1dzeta. pose alpha := 'Res[H] (\sum_(zeta <- calH2) (a_ zeta)^* / '[zeta] *: zeta). have{Dchi} Dchi: {in H^#, forall x, chi x = a / '[zeta1] * zeta1 x + alpha x}. @@ -519,10 +527,10 @@ have{Dchi} Dchi: {in H^#, forall x, chi x = a / '[zeta1] * zeta1 x + alpha x}. rewrite mem_filter => /and4P[/= zeta1'z _ S1zeta _]. by rewrite Da_ ?o_tau1S_chi // conjC0 !mul0r. have kerHalpha: {subset irr_constt alpha <= Iirr_ker H P}. - move=> s; apply: contraR => kerP's; rewrite [alpha]rmorph_sum cfdot_suml. + move=> s; apply: contraR => kerP's; rewrite [alpha]rmorph_sum linear_suml /=. rewrite big1_seq // => psi; rewrite mem_filter /= andbC => /andP[]. - case/seqIndP=> r _ ->; rewrite mem_seqInd // !inE sub1G andbT negbK => kerPr. - rewrite cfdot_Res_l cfdotZl mulrC cfdot_sum_irr big1 ?mul0r // => t _. + case/seqIndP=> r _ ->; rewrite mem_seqInd //= !inE sub1G andbT negbK => kerPr. + rewrite cfdot_Res_l linearZl_LR /= [_ *: _]mulrC cfdot_sum_irr /= big1 ?mul0r // => t _. apply: contraNeq kerP's; rewrite mulf_eq0 fmorph_eq0 inE => /norP[rSt sSt]. by rewrite (sub_cfker_constt_Ind_irr sSt) -?(sub_cfker_constt_Ind_irr rSt). have Zalpha: alpha \in 'Z[irr H]. @@ -537,32 +545,36 @@ exists alpha => //; split=> //. set a1 := a / _ in Dchi; pose phi := a1 *: 'Res zeta1 + alpha. transitivity (#|H|%:R * '[phi] - `|phi 1%g| ^+ 2). rewrite (cfnormE (cfun_onG phi)) mulVKf ?neq0CG // addrC. - rewrite (big_setD1 _ (group1 H)) addKr; apply: eq_bigr => x H1x. + rewrite /= (big_setD1 _ (group1 H)) addKr; apply: eq_bigr => x H1x. by have [_ Hx] := setD1P H1x; rewrite !cfunE cfResE // Dchi. have Qa1: a1 \in Creal. apply: rpred_div; first by rewrite rpred_Cint. by rewrite rpred_Cnat // Cnat_cfdot_char ?(seqInd_char S1zeta1). - rewrite cfnormDd; last first. - rewrite [alpha]cfun_sum_constt cfdotZl cfdot_sumr big1 ?mulr0 // => s. - move/kerHalpha; rewrite inE cfdotZr mulrC cfdot_Res_l => kerPs. - have [r kerP'r ->] := seqIndP S1zeta1; rewrite cfdot_sum_irr big1 ?mul0r //. + rewrite hnormDd /=; last first. + rewrite [alpha]cfun_sum_constt /= linearZl_LR /= linear_sumr big1 ?[_ *: _]mulr0 //= => s. + move/kerHalpha; rewrite inE linearZr_LR /= mulrC cfdot_Res_l/= => kerPs. + have [r kerP'r ->] := seqIndP S1zeta1; rewrite cfdot_sum_irr big1 ?mul0r //. move=> t _; apply: contraTeq kerP'r; rewrite !inE sub1G andbT negbK. rewrite mulf_eq0 fmorph_eq0 => /norP[]; rewrite -!irr_consttE. by move=> /sub_cfker_constt_Ind_irr-> // /sub_cfker_constt_Ind_irr <-. - rewrite cfnormZ 2!cfunE cfRes1 2?real_normK //; last first. - rewrite rpredD 1?rpredM // Creal_Cint ?Cint_vchar1 // ?char_vchar //. + rewrite dnormZ /= 2!cfunE /= cfRes1 /= 2?real_normK //; last first. + rewrite rpredD 1?rpredM // Creal_Cint /= ?Cint_vchar1 // ?char_vchar //. by rewrite (seqInd_char S1zeta1). + (* rewrite dnormZ /= 2!cfunE cfRes1 2?real_normK //; last first. *) + (* rewrite rpredD 1?rpredM // Creal_Cint ?Cint_vchar1 // ?char_vchar //. *) + (* by rewrite (seqInd_char S1zeta1). *) rewrite mulrDr mulrCA sqrrD opprD addrACA; congr (_ + _); last first. rewrite (cfnormE (cfun_onG _)) mulVKf ?neq0CG //. - by rewrite (big_setD1 1%g) // Cint_normK ?Cint_vchar1 // addrC addKr. + by rewrite (big_setD1 1%g) // Cint_normK /= ?Cint_vchar1 // addrC addKr. rewrite opprD addrA; congr (_ - _); last first. rewrite -[_ * a * _]mulrA -mulr_natl; congr (_ * _). by rewrite -[a1 * _]mulrA -(mulrA a); congr (_ * _); rewrite -mulrA mulrC. rewrite mulrBr; congr (_ - _); last first. by rewrite mulrACA -expr2 -!exprMn mulrAC. rewrite -mulrA exprMn -mulrA; congr (_ * _); rewrite expr2 -mulrA. - congr (_ * _); apply: canLR (mulKf (cfnorm_seqInd_neq0 nsHS S1zeta1)) _. - rewrite (cfnormE (cfun_onG _)) mulVKf ?neq0CG // mulrC. + congr (_ * _); apply: canLR (mulKf (cfnorm_seqInd_neq0 nsHS S1zeta1)) _ =>//. + set rhs := '[zeta1] *_. + rewrite {1}(cfnormE (cfun_onG _)) mulVKf /= ?neq0CG // /rhs mulrC. rewrite (cfnormE (seqInd_on nsHS S1zeta1)) mulVKf ?neq0CG //. by apply: eq_bigr => x Hx; rewrite cfResE. rewrite -subn1 natrB // -Cint_normK ?Cint_vchar1 // mulrBl mul1r ler_subl_addl. @@ -585,9 +597,9 @@ Let o_tau1_eta (tau1 : {additive _}) i j: Proof. move=> cohS _ /zchar_expansion[|z Zz ->]. by rewrite filter_uniq ?seqInd_uniq. -rewrite raddf_sum cfdot_suml big1_seq //= => phi; rewrite mem_filter. +rewrite raddf_sum linear_suml big1_seq //= => phi; rewrite mem_filter. case/andP=> irr_phi /(coherent_ortho_cycTIiso StypeP sSS0 cohS) o_phi_eta. -by rewrite raddfZ_Cint {Zz}//= cfdotZl o_phi_eta ?mulr0. +by rewrite raddfZ_Cint {Zz}//= linearZl_LR /= o_phi_eta ?[_*:_]mulr0. Qed. Let P1_int2_lb b : b \in Cint -> 2%:R * u%:R * b <= #|P|.-1%:R * b ^+ 2. @@ -612,10 +624,10 @@ have S1lam: lambda \in calS1. rewrite -(sub_cfker_Ind_irr r (gFsub _ _) (gFnorm _ _)) /= -Dr. by rewrite Ds sub_cfker_Ind_irr ?gFsub ?gFnorm. have [|alpha [Zalpha kerPalpha]] := calS1_split1 cohS S1lam Zlam1. - move=> zeta S1zeta lam'zeta; rewrite Itau1 ?sS1S //. + move=> zeta S1zeta lam'zeta; rewrite Itau1 /= ?sS1S //. suffices: pairwise_orthogonal calS1 by case/pairwise_orthogonalP=> _ ->. by rewrite seqInd_orthogonal ?gFnormal. -rewrite Itau1 ?mem_zchar // irrWnorm // expr1n !divr1 mul1r => [[Dlam ->]]. +rewrite Itau1 /= ?mem_zchar // irrWnorm // expr1n !divr1 mul1r => [[Dlam ->]]. rewrite mulr1 -ler_subl_addl addrC opprB subrK calHuq //; apply: ler_trans. have [[x W2x ntx] [y W1y nty]] := (trivgPn _ ntW2, trivgPn _ ntW1). have [_ _ _ [_ _ sW2P _ _] _] := StypeP; have Px := subsetP sW2P x W2x. @@ -639,7 +651,7 @@ have{y W1y W2x nty} lamAmod: (tau1 lambda x == lambda x %[mod 1 - eps])%A. by rewrite groupMr //= -[y \in PU]andbT -W1y -in_setI tiPUW1 !inE. rewrite (cfun_on0 PUlam PU'yx) (ortho_cycTIiso_vanish pddS) //. apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i [j ->]] ->]. - by rewrite (coherent_ortho_cycTIiso StypeP sSS0). + by rewrite /= (coherent_ortho_cycTIiso StypeP sSS0). rewrite !inE (groupMl x (subsetP sW1W y _)) // (subsetP sW2W) // andbT. rewrite groupMl // -[x \in _]andTb -PUx -in_setI tiPUW1 !inE negb_or ntx /=. by rewrite (contra _ PU'yx) // => /(subsetP sW2P)/(subsetP sPPU). @@ -663,7 +675,7 @@ have Zeta10: eta10 \in 'Z[irr G] by rewrite cycTIiso_vchar. have [tau1 cohS [b _ Dtau1]] := FTtypeP_coherence. have{b Dtau1} oS1eta10: {in calS1, forall zeta, '[tau1 zeta, eta10] = 0}. move=> zeta /S1cases[[j nz_j ->] | /o_tau1_eta-> //]. - rewrite Dtau1 // cfdotZl cfdot_suml big1 ?mulr0 // => i _. + rewrite Dtau1 // linearZl_LR linear_suml /= big1 ?[_ *: _]mulr0 // => i _. by rewrite cfdot_cycTIiso signW2_eq0 (negPf nz_j) andbF. have [_ /oS1eta10//|alpha [Zalpha kerPalpha]] := calS1_split1 cohS S1mu1 Zeta10. rewrite {}oS1eta10 // expr0n mulr0 !mul0r subrr add0r => [[Deta10 -> ub_alpha]]. @@ -739,9 +751,9 @@ have Zeta01: eta01 \in 'Z[irr G] by rewrite cycTIiso_vchar. pose j1 := signW2 b #1; pose d : algC := (-1) ^+ b; pose mu1 := mu_ j1. have nzj1: j1 != 0 by [rewrite signW2_eq0 ?Iirr1_neq0]; have S1mu1 := S1mu nzj1. have o_mu_eta01 j: j != 0 -> '[tau1 (mu_ j), eta01] = d *+ (j == j1). - move/Dtau1->; rewrite -/d cfdotZl cfdot_suml big_ord_recl /=. - rewrite cfdot_cycTIiso andTb (inv_eq (signW2K b)). - by rewrite big1 ?addr0 ?mulr_natr // => i _; rewrite cfdot_cycTIiso. + move/Dtau1->; rewrite /= -/d linearZl_LR /= linear_suml /= big_ord_recl /=. + rewrite /= cfdot_cycTIiso andTb (inv_eq (signW2K b)). + by rewrite big1 ?addr0 ?[_ *: _]mulr_natr // => i _; rewrite cfdot_cycTIiso. have [zeta | alpha [Zalpha kerPalpha [_]]] := calS1_split1 cohS S1mu1 Zeta01. case/S1cases=> [[j nz_j ->] | /o_tau1_eta-> //]. by rewrite o_mu_eta01 // (inj_eq (prTIred_inj _)) => /negPf->. @@ -1073,17 +1085,17 @@ have /idPn[]: '[tau1S (lambda - mu_ #1), tau1T (theta - nu_ #1)] == 0. rewrite oHK //. by rewrite Hdlambda ?FTseqInd_TIred ?FTprTIred_Ind_Fitting ?Iirr1_neq0. by rewrite Kdtheta ?FTseqInd_TIred ?FTprTIred_Ind_Fitting ?Iirr1_neq0. -rewrite !raddfB /= !cfdotBl o_lambda_theta Dtau1Smu ?Dtau1Tnu ?Iirr1_neq0 //. -rewrite !cfdotZl !cfdotZr rmorph_sign !cfdot_suml big1 => [|i _]; last first. - rewrite cfdotC etaC (coherent_ortho_cycTIiso TtypeP _ cohT) ?conjC0 //. +rewrite !raddfB /= !linearBl /= o_lambda_theta Dtau1Smu ?Dtau1Tnu ?Iirr1_neq0 //. +rewrite !linearZl_LR /= !linearZr_LR /= rmorph_sign /= !linear_suml /= big1 => [|i _]; last first. + rewrite cfdotC /= etaC (coherent_ortho_cycTIiso TtypeP _ cohT) ?conjC0 //. by apply: seqInd_conjC_subset1; apply: Fcore_sub_FTcore. -rewrite cfdot_sumr big1 ?mulr0 ?subr0 ?add0r ?opprK => [|j _]; last first. - by rewrite -etaC (coherent_ortho_cycTIiso StypeP _ cohS). +rewrite /= linear_sumr /= big1 ?[_ *:_]mulr0 ?mulr0 ?subr0 ?add0r ?opprK => [|j _]; last first. + by rewrite -etaC (coherent_ortho_cycTIiso StypeP _ cohS). set i1 := iter bT _ #1; set j1 := iter bS _ #1. rewrite !mulf_eq0 !signr_eq0 (bigD1 i1) //= addrC big1 => [|i i1'i]; last first. - rewrite etaC cfdot_sumr big1 // => j _; rewrite cfdot_cycTIiso. + rewrite etaC linear_sumr big1 // => j _; rewrite /= cfdot_cycTIiso. by rewrite (negPf i1'i) andbF. -rewrite etaC cfdot_sumr (bigD1 j1) //= cfdot_cycTIiso !eqxx addrCA. +rewrite etaC linear_sumr (bigD1 j1) //= cfdot_cycTIiso !eqxx addrCA. rewrite big1 ?addr0 ?oner_eq0 // => j j1'j; rewrite cfdot_cycTIiso. by rewrite eq_sym (negPf j1'j). Qed. @@ -1127,7 +1139,7 @@ have{meanTI} meanG f : by case: (x =P 1%g) => //= ->; rewrite mem_class_support ?group1. have lam1_ub: mean G0 G (nm2 lam1) <= lambda 1%g ^+ 2 / #|S|%:R - g^-1. have [[Itau1 Ztau1] _] := cohS. - have{Itau1} n1lam1: '[lam1] = 1 by rewrite Itau1 ?mem_zchar ?irrWnorm. + have{Itau1} n1lam1: '[lam1] = 1 by rewrite Itau1 /= ?mem_zchar ?irrWnorm. have{Ztau1} Zlam1: lam1 \in 'Z[irr G] by rewrite Ztau1 ?mem_zchar. rewrite -ler_opp2 opprB -(ler_add2l '[lam1]) {1}n1lam1 addrCA. rewrite (cfnormE (cfun_onG _)) (mulrC g^-1) [_ / g](meanG (nm2 _)) // addrK. @@ -1878,13 +1890,13 @@ have A0beta j: j != 0 -> beta_ j \in 'CF(S, 'A0(S)). move/PVSbeta; apply: cfun_onS; rewrite (FTtypeP_supp0_def _ StypeP) //. by rewrite setSU ?(subset_trans _ (FTsupp1_sub _)) ?setSD ?Fcore_sub_FTcore. have norm_beta j: j != 0 -> '[beta_ j] = (u.-1 %/ q + 2)%:R. - move=> nzj; rewrite cfnormBd ?Dgamma; last first. + move=> nzj; rewrite hnormBd /= ?Dgamma; last first. apply: contraNeq (cfker_prTIres pddS nzj); rewrite -irr_consttE => S1_mu0j. rewrite -(cfRes_prTIirr _ 0) sub_cfker_Res //. rewrite (subset_trans _ (cfker_constt _ S1_mu0j)) ?cfker_mod //. by rewrite -Dgamma cfInd_char ?rpred1. have [[/eqP defUW1 _] [/eqP defSbar _]] := (andP frobUW1, andP frobSbar). - rewrite cfnorm_irr cfMod_iso //. + rewrite cfnorm_irr cfMod_iso //=. rewrite (cfnormE (cfInd_on _ (cfun_onG _))) ?quotientS // -/gamma. rewrite card_quotient ?gFnorm // -(index_sdprod defS_P) -(sdprod_card defUW1). rewrite -/u -/q (big_setD1 1%g) ?mem_class_support ?group1 //=. @@ -1906,8 +1918,8 @@ have oeta01_1: '[eta01, 1] = 0. have Deta01s: eta01^*%CF = eta_ 0 (conjC_Iirr #1). by rewrite cfAut_cycTIiso /w_ !dprod_IirrEr cfAutDprodr aut_IirrE. have oGamma1: '[Gamma, 1] = 0. - rewrite cfdotDl cfdotBl cfnorm1 oeta01_1 addr0 Dtau ?A0beta //. - rewrite -cfdot_Res_r rmorph1 cfdotBl -cfdot_Res_r rmorph1 cfnorm1. + rewrite linearDl /= linearBl /= cfnorm1 /= oeta01_1 addr0 Dtau /= ?A0beta //. + rewrite -cfdot_Res_r rmorph1 linearBl /= -cfdot_Res_r rmorph1 cfnorm1. by rewrite -(prTIirr00 ptiWS) cfdot_prTIirr (negPf nzj1) subr0 subrr. have defGamma j: j != 0 -> tau (beta_ j) - 1 + eta_ 0 j = Gamma. move=> nzj; apply/eqP; rewrite -subr_eq0 opprD addrACA opprB !addrA subrK. @@ -1924,30 +1936,30 @@ have Za: a \in Cint. rewrite Cint_cfdot_vchar ?(rpredB, rpredD, rpred1, cycTIiso_vchar) //. by rewrite Dtau ?A0beta // !(cfInd_vchar, rpredB) ?rpred1 ?irr_vchar. have{oYeta} oYeta j: '[Y, eta_ 0 j] = 0. - by rewrite (orthoPl oYeta) ?map_f ?mem_irr. + by rewrite (orthoPl _ _ _ oYeta) ?map_f ?mem_irr. have o_eta1s1: '[eta01^*, eta01] = 0. rewrite Deta01s cfdot_cycTIiso /= -(inj_eq irr_inj) aut_IirrE. by rewrite odd_eq_conj_irr1 ?mFT_odd // irr_eq1 (negPf nzj1). rewrite -(ler_add2r 2%:R) -natrD -(norm_beta #1) //. have ->: '[beta_ #1] = '[Gamma - eta01 + 1]. by rewrite addrK subrK Dade_isometry ?A0beta. -rewrite addrA cfnormDd ?cfnorm1 ?ler_add2r; last first. - by rewrite cfdotBl oeta01_1 oGamma1 subrr. -rewrite defXY addrAC addrC cfnormDd ?ler_add2r; last first. - by rewrite cfdotBl oXY cfdotC oYeta conjC0 subrr. +rewrite addrA hnormDd /= ?cfnorm1 ?ler_add2r; last first. + by rewrite linearBl /= oeta01_1 oGamma1 subrr. +rewrite defXY addrAC addrC hnormDd /= ?ler_add2r; last first. + by rewrite linearBl /= oXY cfdotC oYeta conjC0 subrr. have oXeta j: '[X, eta_ 0 j] = '[Gamma, eta_ 0 j]. - by rewrite defXY cfdotDl oYeta addr0. + by rewrite defXY linearDl /= oYeta addr0. pose X1 := X - a *: eta01 - a *: eta01^*%CF. have ->: X - eta01 = X1 + a *: eta01^*%CF + (a - 1) *: eta01. by rewrite scalerBl scale1r addrA !subrK. -rewrite cfnormDd; last first. - rewrite cfdotZr subrK cfdotBl oXeta -/a cfdotZl cfnorm_cycTIiso mulr1. +rewrite hnormDd /=; last first. + rewrite linearZr_LR subrK linearBl /= oXeta -/a linearZl_LR /= cfnorm_cycTIiso [_ *:_]mulr1. by rewrite subrr mulr0. -rewrite cfnormDd; last first. - rewrite cfdotZr !cfdotBl !cfdotZl Deta01s cfnorm_cycTIiso oXeta -Deta01s. - rewrite !cfdot_conjCr o_eta1s1 conjC0 mulr0 ((_ =P Gamma) GammaReal) -/a. - by rewrite conj_Cint // mulr1 subr0 subrr mulr0. -rewrite -addrA ler_paddl ?cfnorm_ge0 // !cfnormZ Deta01s !cfnorm_cycTIiso. +rewrite hnormDd /=; last first. + rewrite linearZr_LR /= !linearBl /= !linearZl_LR /= Deta01s /= cfnorm_cycTIiso oXeta -Deta01s. + rewrite !cfdot_conjCr o_eta1s1 conjC0 [_ *:_]mulr0 ((_ =P Gamma) GammaReal) -/a. + by rewrite conj_Cint // [ _ *: _ ]mulr1 subr0 subrr mulr0. +rewrite -addrA ler_paddl ?cfnorm_ge0 // !dnormZ Deta01s /= !cfnorm_cycTIiso. rewrite !mulr1 !Cint_normK ?rpredB ?rpred1 // sqrrB1 !addrA -mulr2n. by rewrite -subr_ge0 addrK subr_ge0 ler_pmuln2r ?Cint_ler_sqr. Qed. @@ -2052,16 +2064,16 @@ have otau1eta: orthogonal (map tau1 calL) (map sigma (irr W)). by apply/set0Pn; exists x; rewrite !inE Ax orbC mem_class_support. have opsi: '[psi, psi^*] = 0 by apply: seqInd_conjC_ortho (mFT_odd _) _ Lpsi. have n2Psi: '[Psi] = 2%:R. - by rewrite Itau1 ?cfnormBd // cfnorm_conjC ?irrWnorm ?irrL. + by rewrite Itau1 /= ?hnormBd //= cfnorm_conjC ?irrWnorm ?irrL. have NC_Psi: (NC Psi < minn q p)%N. by rewrite (@leq_ltn_trans 2) ?leq_min ?qgt2 // cycTI_NC_norm ?Ztau1 ?n2Psi. apply: contraTeq (NC_Psi) => t1psi_eta; rewrite -leqNgt cycTI_NC_minn //. rewrite mul2n -addnn (leq_trans NC_Psi) ?leq_addl // andbT card_gt0. suffices [b Deta]: exists b : bool, eta_ i j = (-1) ^+ b *: tau1 psi. - apply/set0Pn; exists (i, j); rewrite !inE /= /Psi raddfB cfdotBl {2}Deta. - by rewrite cfdotZr Itau1 ?mem_zchar // cfdot_conjCl opsi conjC0 mulr0 subr0. + apply/set0Pn; exists (i, j); rewrite !inE /= /Psi raddfB linearBl /= {2}Deta. + by rewrite linearZr_LR /= Itau1 /= ?mem_zchar // cfdot_conjCl opsi conjC0 mulr0 subr0. exists (tau1 psi == - eta_ i j); apply: (canRL (signrZK _)). - move/eqP: t1psi_eta; rewrite cfdot_dirr ?cycTIiso_dirr //; last first. + move/eqP: t1psi_eta; rewrite /= cfdot_dirr ?cycTIiso_dirr //; last first. by rewrite dirrE Itau1 ?Ztau1 ?mem_zchar //= irrWnorm ?irrL. by rewrite scaler_sign; do 2!case: eqP => //. have [[A0beta PVbeta] n2beta [defGa Ga1 R_Ga] ubGa dvu] := FTtypeP_bridge_facts. @@ -2078,9 +2090,9 @@ have o_tauL_S zeta j: j != 0 -> '[tauL zeta, tau (beta_ j)] = 0. rewrite (cfdotElr (Dade_cfunS _ _) PWGbeta) big_pred0 ?mulr0 // => x. by rewrite FT_DadeF_supportE -defA tiA_PWG inE. have betaLeta j: j != 0 -> '[tauL betaL, eta_ 0 j] = '[tauL betaL, eta01]. - move=> nzj; apply/eqP; rewrite -subr_eq0 -cfdotBr. + move=> nzj; apply/eqP; rewrite -subr_eq0 -linearBr. rewrite (canRL (addKr _) (defGa j nzj)) !addrA addrK -addrA addrCA. - by rewrite opprD subrK cfdotBr !o_tauL_S ?subrr ?Iirr1_neq0. + by rewrite opprD subrK linearBr /= !o_tauL_S ?subrr ?Iirr1_neq0. split=> //; have [[[Itau1 Ztau1] Dtau1] irr_phi] := (cohL, irrL Lphi). pose GammaL := tauL betaL - (1 - tau1 phi). have DbetaL: tauL betaL = 1 - tau1 phi + GammaL by rewrite addrC subrK. @@ -2093,7 +2105,7 @@ have:= Dade_Ind1_sub_lin cohL _ irr_phi Lphi; rewrite -/betaL -/tauL -/calL. rewrite (seqInd_nontrivial _ _ _ Lphi) ?odd_Frobenius_index_ler ?mFT_odd //. case=> // -[o_tauL_1 o_betaL_1 ZbetaL] ub_betaL _. have{o_tauL_1 o_betaL_1} o_GaL_1: '[GammaL, 1] = 0. - by rewrite !cfdotBl cfnorm1 o_betaL_1 (orthoPr o_tauL_1) ?map_f ?subr0 ?subrr. + by rewrite !linearBl /= cfnorm1 o_betaL_1 (orthoPr _ _ _ o_tauL_1) ?map_f ?subr0 ?subrr. have Zt1phi: tau1 phi \in 'Z[irr G] by rewrite Ztau1 ?mem_zchar. have Zeta01: eta01 \in 'Z[irr G] by apply: cycTIiso_vchar. have ZbetaS: tau betaS \in 'Z[irr G]. @@ -2107,15 +2119,21 @@ set bSphi := '[tau betaS, tau1 phi]; set bLeta := '[tauL betaL, eta01]. have [ZbSphi ZbLeta]: bSphi \in Cint /\ bLeta \in Cint. by rewrite !Cint_cfdot_vchar. have{Gamma_even} odd_bSphi_bLeta: (bSphi + bLeta == 1 %[mod 2])%C. - rewrite -(conj_Cint ZbSphi) -cfdotC /bLeta DbetaL cfdotDl cfdotBl. + rewrite -(conj_Cint ZbSphi) -cfdotC /bLeta DbetaL linearDl linearBl /=. have: '[tauL betaL, tau betaS] == 0 by rewrite o_tauL_S ?Iirr1_neq0. have ->: tau betaS = 1 - eta01 + Gamma by rewrite addrCA !addrA !subrK. - rewrite !['[tau1 _, _]]cfdotDr 2!cfdotDr !cfdotNr DbetaL. - rewrite 2!cfdotDl 2!['[_, eta01]]cfdotDl 2!['[_, Gamma]]cfdotDl !cfdotNl. + do 2!(rewrite ['[tau1 _, _]]linearDr /=). + do 2!(rewrite linearDr /=); rewrite !linearNr DbetaL /=. + (* rewrite !['[tau1 _, _]]linearDr 2!linearDr !linearNr DbetaL /=. *) + rewrite 2!linearDl/=. + do 2! (rewrite ['[_, eta01]]linearDl /=). + do 2! (rewrite ['[_, Gamma]]linearDl /=). + rewrite !linearNl /=. rewrite cfnorm1 o_GaL_1 ['[1, Gamma]]cfdotC Ga1 conjC0 addr0 add0r. have ->: 1 = eta_ 0 0 by rewrite /w_ cycTIirr00 cycTIiso1. - rewrite cfdot_cycTIiso mulrb ifN_eqC ?Iirr1_neq0 // add0r. - rewrite 2?(orthogonalP otau1eta _ _ (map_f _ _) (mem_eta _)) // oppr0 !add0r. + rewrite cfdot_cycTIiso mulrb ifN_eqC ?Iirr1_neq0 // add0r. + rewrite (orthogonalP _ _ otau1eta _ _ (map_f _ _) (mem_eta _)) //=. + rewrite (orthogonalP _ _ otau1eta _ _ (map_f _ _) (mem_eta _)) //= oppr0 !add0r. by rewrite addr0 addrA addrC addr_eq0 !opprB addrA /eqCmod => /eqP <-. have abs_mod2 a: a \in Cint -> {b : bool | a == b%:R %[mod 2]}%C. move=> Za; pose n := truncC `|a|; exists (odd n). @@ -2143,11 +2161,13 @@ case is_c1: bS; [left | right]. have [_ -> defX] := orthonormal_span oo_tau1L tau1X. rewrite defX big_map scaler_sumr; apply: eq_big_seq => psi Lpsi. rewrite scalerA; congr (_ *: _); apply/eqP; rewrite -subr_eq0 mulrC. - rewrite -[X](addrK D) -dGa cfdotBl (orthoPl oDtau1) ?map_f // subr0. - rewrite cfdotC cfdotDr cfdotBr -/betaS -/eta01. + rewrite -[X](addrK D) -dGa linearBl /= (orthoPl _ _ _ oDtau1) ?map_f // subr0. + rewrite cfdotC linearDr linearBr -/betaS -/eta01 /=. have ->: 1 = eta_ 0 0 by rewrite /w_ cycTIirr00 cycTIiso1. - rewrite 2?(orthogonalP otau1eta _ _ (map_f _ _) (mem_eta _)) // subrK. - rewrite -cfdotC -(conj_Cnat (Na_ _ Lpsi)) -cfdotZr -cfdotBr. + rewrite (orthogonalP _ _ otau1eta _ _ (map_f _ _) (mem_eta _)) //=. + rewrite (orthogonalP _ _ otau1eta _ _ (map_f _ _) (mem_eta _)) //= subrK. + (* rewrite 2?(orthogonalP _ _ otau1eta _ _ (map_f _ _) (mem_eta _)) // subrK. *) + rewrite -cfdotC -(conj_Cnat (Na_ _ Lpsi)) -linearZ -linearBr /=. rewrite -raddfZ_Cnat ?Na_ // -raddfB cfdotC. rewrite Dtau1; last by rewrite zcharD1_seqInd ?seqInd_sub_lin_vchar. by rewrite o_tauL_S ?Iirr1_neq0 ?conjC0. @@ -2157,7 +2177,7 @@ case is_c1: bS; [left | right]. - by rewrite cfdotC oXD conjC0. - apply/orthoPl=> eta Weta; rewrite (span_orthogonal otau1eta) //. exact: memv_span. - rewrite defX cfnormZ cfnorm_sum_orthonormal // mulr_sumr !big_seq. + rewrite defX dnormZ /= cfnorm_sum_orthonormal // mulr_sumr !big_seq. apply: ler_sum => psi Lpsi; rewrite -{1}(norm_Cnat (Na_ _ _)) //. by rewrite ler_pemull ?exprn_ge0 ?normr_ge0 // Cint_normK // sqr_Cint_ge1. congr (_ <= _): ub_a; do 2!apply: (mulIf (neq0CiG L H)); rewrite -/e. @@ -2178,17 +2198,17 @@ have ooX0: orthonormal calX0. have Isigma: {in 'Z[calX0] &, isometry sigma}. by apply: in2W; apply: cycTIisometry. rewrite -[X](subrK (bLeta *: (\sum_(xi <- calX0) sigma xi))). -rewrite cfnormDd ?ler_paddl ?cfnorm_ge0 //; last first. - rewrite cfdotZr cfdot_sumr big1_seq ?mulr0 // => xi X0xi. - apply/eqP; rewrite cfdotBl scaler_sumr cfproj_sum_orthonormal // subr_eq0. +rewrite hnormDd /= ?ler_paddl ?cfnorm_ge0 //; last first. + rewrite linearZr_LR /= linear_sumr/= big1_seq ?mulr0 // => xi X0xi. + apply/eqP; rewrite linearBl scaler_sumr /= cfproj_sum_orthonormal // subr_eq0. have {xi X0xi}[j nzj ->] := imageP X0xi; rewrite inE /= in nzj. - rewrite -[bLeta](betaLeta j nzj) defX cfdotDl -addrA cfdotDl. + rewrite -[bLeta](betaLeta j nzj) defX linearDl -addrA linearDl /=. have ->: 1 = eta_ 0 0 by rewrite /w_ cycTIirr00 cycTIiso1. rewrite cfdot_cycTIiso mulrb (ifN_eqC _ _ nzj) add0r eq_sym -subr_eq0 addrK. rewrite (span_orthogonal otau1eta) //; last by rewrite memv_span ?mem_eta. rewrite big_seq rpredD ?(rpredN, rpredZ, rpred_sum) ?memv_span ?map_f //. by move=> xi Lxi; rewrite rpredZ ?memv_span ?map_f. -rewrite cfnormZ cfnorm_map_orthonormal // size_image cardC1 nirrW2. +rewrite dnormZ /= cfnorm_map_orthonormal // size_image cardC1 nirrW2. rewrite -(natrB _ (prime_gt0 pr_p)) Cint_normK // subn1. by rewrite ler_pemull ?ler0n ?sqr_Cint_ge1. Qed. diff --git a/theories/PFsection14.v b/theories/PFsection14.v index 10bdafb..3f47650 100644 --- a/theories/PFsection14.v +++ b/theories/PFsection14.v @@ -20,7 +20,7 @@ Require Import BGsection14 BGsection15 BGsection16 BGappendixC. From mathcomp Require Import ssrnum rat algC cyclotomic algnum. From mathcomp -Require Import classfun character integral_char inertia vcharacter. +Require Import forms classfun character integral_char inertia vcharacter. From odd_order Require Import PFsection1 PFsection2 PFsection3 PFsection4. From odd_order @@ -48,6 +48,14 @@ Implicit Types H K L N P Q R S T U W : {group gT}. Local Notation "#1" := (inord 1) (at level 0). +Notation pairwise_orthogonal := (pairwise_orthogonal [hermitian of @cfdot _ _]). +Notation pairwise_orthogonalP := (pairwise_orthogonalP [dot of @cfdot _ _]). +Notation orthogonal := (orthogonal [hermitian of @cfdot _ _]). +Notation orthogonalP := (orthogonalP [hermitian of @cfdot _ _]). +Notation orthonormal := (orthonormal [hermitian of @cfdot _ _]). +Notation orthonormalP := (orthonormalP [dot of @cfdot _ _]). +Notation orthogonal_split := (orthogonal_split [dot of @cfdot _ _]). + (* Supplementary results that apply to both S and T, but that are not *) (* formally stated as such; T, V, L, tau1L and phi are only used at the end *) (* of this section, to state and prove FTtype2_support_coherence. *) @@ -231,9 +239,9 @@ have lb_b ij (b_ij := b (sigma 'chi_ij)): 1 <= `|b_ij| ^+ 2 ?= iff [exists n : bool, b_ij == (-1) ^+ n]. - have /codomP[[i j] Dij] := dprod_Iirr_onto defW ij. have{b_ij} ->: b_ij = a i j. - rewrite /a /w_ -Dij Dbeta defGa 2!cfdotDl. + rewrite /a /w_ -Dij Dbeta defGa 2!linearDl /=. have ->: '[X, sigma 'chi_ij] = b_ij by rewrite /b_ij Db. - by rewrite (orthoPl oYeta) ?(orthoPl oZeta) ?map_f ?mem_irr // !addr0. + by rewrite (orthoPl _ _ _ oYeta) ?(orthoPl _ _ _ oZeta) ?map_f ?mem_irr // !addr0. have Zaij: a i j \in Cint by rewrite Cint_cfdot_vchar ?cycTIiso_vchar. rewrite Cint_normK //; split. rewrite sqr_Cint_ge1 //; apply: contraTneq (a_odd i j) => ->. @@ -256,7 +264,7 @@ rewrite sumr_const addr0 => /(lerif_trans ub_e)/ger_lerif/esym. have ->: \sum_i `|b (sigma 'chi_i)| ^+ 2 = '[X]. rewrite defX cfnorm_sum_orthonormal // big_map (big_nth 0) big_mkord. by rewrite size_tuple; apply: eq_bigr => ij _; rewrite -tnth_nth. -rewrite -cfnormDd // -defGa cfnormDd // cfnorm1 -ler_subr_addr ubGa. +rewrite -hnormDd //= -defGa hnormDd //= cfnorm1 -ler_subr_addr ubGa. case/and3P=> /eqP-De /'forall_exists_eqP/fin_all_exists[/= n Dn] /eqP-Y0. pose chi := X - tauL betaL; split=> //; exists n, chi; last first. apply: canRL (addrK _) _; rewrite addrC subrK defX big_map (big_nth 0). @@ -266,10 +274,10 @@ have Z1chi: chi \in dirr G. rewrite defX big_map (big_nth 0) big_mkord size_tuple rpred_sum //= => ij. have [_ Zsigma] := cycTI_Zisometry ctiWG. by rewrite -tnth_nth Dn rpredZsign ?Zsigma ?irr_vchar. - apply/eqP/(addIr '[X]); rewrite -cfnormBd; last first. - rewrite /chi Dbeta defGa Y0 addr0 opprD addNKr cfdotNl. + apply/eqP/(addIr '[X]); rewrite -hnormBd; last first. + rewrite /chi Dbeta defGa Y0 addr0 opprD addNKr linearNl /=. by rewrite (span_orthogonal oZeta) ?oppr0 // memv_span ?mem_head. - rewrite addrAC subrr add0r cfnormN Dade_isometry // cfnormBd; last first. + rewrite addrAC subrr add0r hnormN Dade_isometry // hnormBd /= ; last first. by rewrite cfdotC (seqInd_ortho_Ind1 _ _ Lphi) ?conjC0. rewrite cfnorm_Ind_cfun1 // -/e irrWnorm // addrC; congr (1 + _). rewrite defX cfnorm_sum_orthonormal // big_map big_tuple. @@ -278,12 +286,12 @@ have Z1chi: chi \in dirr G. have [[Itau1 Ztau1] Dtau1] := cohL. suffices /cfdot_add_dirr_eq1: '[tau1L phi - tau1L phi^*%CF, chi] = 1. rewrite -(cfConjC_Dade_coherent cohL) ?mFT_odd // rpredN dirr_aut. - by apply; rewrite // dirrE Ztau1 ?Itau1 ?mem_zchar ?irrWnorm /=. -rewrite cfdotBr (span_orthogonal o_tauLeta) ?add0r //; last first. + by apply; rewrite // dirrE Ztau1 /= ?Itau1 /= ?mem_zchar ?irrWnorm /=. +rewrite linearBr /= (span_orthogonal o_tauLeta) ?add0r //; last first. by rewrite rpredB ?memv_span ?map_f ?cfAut_seqInd. have Zdphi := seqInd_sub_aut_zchar nsHL conjC Lphi. rewrite -raddfB Dtau1 ?zcharD1_seqInd // Dade_isometry ?(zchar_on Zdphi) //. -rewrite cfdotBr !cfdotBl cfdot_conjCl cfAutInd rmorph1 irrWnorm //. +rewrite linearBr !linearBl /= cfdot_conjCl cfAutInd rmorph1 irrWnorm //. rewrite (seqInd_ortho_Ind1 _ _ Lphi) // conjC0 subrr add0r opprK. by rewrite cfdot_conjCl (seqInd_conjC_ortho _ _ _ Lphi) ?mFT_odd ?conjC0 ?subr0. Qed. @@ -352,7 +360,7 @@ rewrite -/tauL -/betaL -/calL => ZbetaL [Gamma [_ _ [b _ Dbeta]]]. rewrite odd_Frobenius_index_ler ?mFT_odd // -/u => -[]// _ ub_Ga _ nz_a. have Za: a \in Cint by rewrite Cint_cfdot_vchar // ?Ztau1 ?mem_zchar. have [X M_X [Del [defGa oXD oDM]]] := orthogonal_split (map tau1M calM) Gamma. -apply: ler_trans ub_Ga; rewrite defGa cfnormDd // ler_paddr ?cfnorm_ge0 //. +apply: ler_trans ub_Ga; rewrite defGa hnormDd // ler_paddr ?cfnorm_ge0 //=. suffices ->: '[X] = (a / v) ^+ 2 * (\sum_(xi <- calM) xi 1%g ^+ 2 / '[xi]). rewrite sum_seqIndC1_square // -(natrB _ (cardG_gt0 K)) subn1. rewrite exprMn !mulrA divfK ?neq0CiG // mulrAC -mulrA. @@ -365,14 +373,14 @@ rewrite defX cfnorm_sum_orthonormal // big_map; apply: eq_big_seq => xi Mxi. have Zxi1 := Cint_seqInd1 Mxi; rewrite -(Cint_normK Zxi1) -(conj_Cint Zxi1). rewrite irrWnorm ?irrM // divr1 -!exprMn -!normrM; congr (`|_| ^+ 2). rewrite -mulrA mulrC -mulrA; apply: canRL (mulKf (neq0CiG _ _)) _. -rewrite -(canLR (addrK _) defGa) cfdotBl (orthoPl oDM) ?map_f // subr0. -rewrite -(canLR (addKr _) Dbeta) cfdotDl cfdotNl cfdotC cfdotDr cfdotBr. -rewrite (orthoPr oM1) ?map_f // (orthogonalP oML) ?map_f // subrr add0r. -rewrite cfdotZr cfdot_sumr big1_seq ?mulr0 ?oppr0 => [|nu Mnu]; last first. - by rewrite cfdotZr (orthogonalP oML) ?map_f ?mulr0. -apply/eqP; rewrite conjC0 oppr0 add0r -subr_eq0 -conjC_nat -!cfdotZr. -rewrite -raddfZnat -raddfZ_Cint // -cfdotBr -raddfB -/v -psi1. -rewrite Dtau1 ?zcharD1_seqInd ?sub_seqInd_zchar //. +rewrite -(canLR (addrK _) defGa) linearBl /= (orthoPl _ _ _ oDM) ?map_f // subr0. +rewrite -(canLR (addKr _) Dbeta) linearDl linearNl /= cfdotC linearDr linearBr /=. +rewrite (orthoPr _ _ _ oM1) ?map_f // (orthogonalP _ _ oML) ?map_f // subrr add0r. +rewrite linearZ /= linear_sumr big1_seq ?mulr0 ?oppr0 => [|nu Mnu]; last first. + by rewrite linearZ /= (orthogonalP _ _ oML) ?map_f ?mulr0. +apply/eqP; rewrite conjC0 oppr0 add0r -subr_eq0 -conjC_nat -!linearZ. +rewrite -raddfZnat -raddfZ_Cint // -linearBr -raddfB -/v -psi1. +rewrite Dtau1 ?zcharD1_seqInd ?sub_seqInd_zchar //=. rewrite (cfdotElr (Dade_cfunS _ _) (Dade_cfunS _ _)) setIC. by have:= TItauML; rewrite -setI_eq0 => /eqP->; rewrite big_set0 mulr0. Qed. @@ -774,7 +782,7 @@ rewrite -/q -/u; set Gamma := FTtypeP_bridge_gap _ _ => oGa1 R_Ga lb_Ga _. have oT1eta: orthogonal (map tau1T calT1) (map sigma (irr W)). apply/orthogonalP=> _ _ /mapP[zeta T1zeta ->] /mapP[omega Womega ->]. have{omega Womega} [i [j ->]] := cycTIirrP defW Womega. - by rewrite (cycTIisoC _ pddT) (coherent_ortho_cycTIiso _ sT10 cohT1) ?irrT1. + by rewrite /= (cycTIisoC _ pddT) (coherent_ortho_cycTIiso _ sT10 cohT1) ?irrT1. have [[Itau1T Ztau1T] Dtau1T] := cohT1. have nzT1_Ga zeta: zeta \in calT1 -> `|'[Gamma, tau1T zeta]| ^+ 2 >= 1. have Z_Ga: Gamma \in 'Z[irr G]. @@ -787,9 +795,9 @@ have nzT1_Ga zeta: zeta \in calT1 -> `|'[Gamma, tau1T zeta]| ^+ 2 >= 1. pose betaT0 := nu_ 0 - zeta. have{o_betaT0_eta} o_eta0_betaT0 j: '[eta_ 0 j, tauT betaT0] = (j == 0)%:R. transitivity '[eta_ 0 j, eta_0]; rewrite (cycTIisoC _ pddT). - apply/eqP; rewrite -subr_eq0 -cfdotBr cfdotC. - by rewrite (orthoPl (o_betaT0_eta _ _)) ?conjC0 // map_f ?mem_irr. - rewrite cfdot_sumr (bigD1 0) //= cfdot_cycTIiso andbT big1 ?addr0 //. + apply/eqP; rewrite -subr_eq0 -linearBr /= cfdotC. + by rewrite (orthoPl _ _ _ (o_betaT0_eta _ _)) ?conjC0 // map_f ?mem_irr. + rewrite linear_sumr (bigD1 0) //= cfdot_cycTIiso andbT big1 ?addr0 //. by move=> i /negPf nz_i; rewrite cfdot_cycTIiso andbC eq_sym nz_i. have QVbetaT0: betaT0 \in 'CF(T, QV^#). rewrite cfun_onD1 rpredB ?(seqInd_on _ T1zeta) //=; last first. @@ -801,8 +809,8 @@ have nzT1_Ga zeta: zeta \in calT1 -> `|'[Gamma, tau1T zeta]| ^+ 2 >= 1. by rewrite rpredB ?char_vchar ?(seqInd_char T1zeta) ?prTIred_char. pose Delta := tauT betaT0 - 1 + tau1T zeta. have nz_i1: #1 != 0 := Iirr1_neq0 ntW2. - rewrite -(canLR (addKr _) (erefl Delta)) opprB cfdotDr cfdotBr oGa1 add0r. - rewrite cfdotDl cfdotBl -/betaS o_eta0_betaT0 (negPf nz_i1) // addr0 opprB. + rewrite -(canLR (addKr _) (erefl Delta)) opprB linearDr linearBr /= oGa1 add0r. + rewrite linearDl linearBl /= -/betaS o_eta0_betaT0 (negPf nz_i1) // addr0 opprB. rewrite -(cycTIiso1 pddS) -(cycTIirr00 defW) {}o_eta0_betaT0 mulr1n. have QV'betaS: tauS betaS \in 'CF(G, ~: class_support QV^# G). have [_ [pP _] _ _ [_ ->]] := FTtypeP_facts _ StypeP; rewrite ?A0betaS //. @@ -858,7 +866,7 @@ have o1T1: orthonormal (map tau1T calT1). have [_ -> ->] := orthonormal_span o1T1 T1_Y. rewrite cfnorm_sum_orthonormal // big_map -sum1_size natr_sum !big_seq. apply: ler_sum => // zeta T1zeta; rewrite -(canLR (addrK X) defGa). -by rewrite cfdotBl (orthoPl oXT1) ?subr0 ?nzT1_Ga ?map_f. +by rewrite linearBl /= (orthoPl _ _ _ oXT1) ?subr0 ?nzT1_Ga ?map_f. Qed. Let Ttype2 := FTtypeP_min_typeII. @@ -1208,12 +1216,12 @@ have oLM: orthogonal (map tau1L calL) (map tau1M calM). case/eqP: nz_a; have lb_h1e_u := ltn_trans v1p_gt_u1q lb_h1e_v. have [] // := FTtype2_support_coherence StypeP TtypeP cohL Lphi. rewrite -/tauL -/sigma => _ [nb [chi Dchi ->]]. -rewrite cfdotBl cfdot_suml big1 => [|ij _]; last first. +rewrite linearBl linear_suml big1 => [|ij _] /=; last first. have [_ o_tauMeta _ _] := FTtypeI_bridge_facts _ StypeP Mtype1 cohM Mpsi psi1. - rewrite cfdotZl cfdotC (orthogonalP o_tauMeta) ?map_f ?mem_irr //. - by rewrite conjC0 mulr0. -case: Dchi => ->; first by rewrite (orthogonalP oLM) ?map_f // subr0. -by rewrite cfdotNl opprK add0r (orthogonalP oLM) ?map_f // cfAut_seqInd. + rewrite linearZl_LR /= cfdotC (orthogonalP _ _ o_tauMeta) ?map_f ?mem_irr //. + by rewrite conjC0 [_ *:_]mulr0. +case: Dchi => ->; first by rewrite (orthogonalP _ _ oLM) ?map_f // subr0. +by rewrite linearNl /= opprK add0r (orthogonalP _ _ oLM) ?map_f // cfAut_seqInd. Qed. Lemma FTtype2_exclusion : False. diff --git a/theories/PFsection2.v b/theories/PFsection2.v index 40b8f0d..341faa3 100644 --- a/theories/PFsection2.v +++ b/theories/PFsection2.v @@ -10,7 +10,7 @@ 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. +Require Import matrix mxalgebra mxrepresentation vector algC forms classfun character. From mathcomp Require Import inertia vcharacter. From odd_order @@ -315,7 +315,8 @@ Qed. Section AutomorphismCFun. Variable u : {rmorphism algC -> algC}. -Local Notation "alpha ^u" := (cfAut u alpha). +Local Notation "alpha ^u" := (cfAut u alpha)(at level 10). + Lemma Dade_aut alpha : (alpha^u)^\tau = (alpha^\tau)^u. Proof. diff --git a/theories/PFsection3.v b/theories/PFsection3.v index 312f4bb..73af8a4 100644 --- a/theories/PFsection3.v +++ b/theories/PFsection3.v @@ -12,7 +12,7 @@ Require Import gfunctor center gproduct cyclic pgroup abelian frobenius. From mathcomp Require Import mxalgebra mxrepresentation vector falgebra fieldext galois. From mathcomp -Require Import ssrnum rat algC algnum classfun character. +Require Import ssrnum rat algC algnum forms classfun character. From mathcomp Require Import integral_char inertia vcharacter. From odd_order @@ -433,6 +433,8 @@ Definition is_Lmodel bb b := forall ij, b ij \in 'Z[irr G] & {in wf_ref bb &, forall ij1 ij2, '[b ij1, b ij2] = (dot_ref ij1 ij2)%:R}]. +Notation orthonormal := (orthonormal [hermitian of @cfdot _ _]). +Notation orthogonal := (orthogonal [hermitian of @cfdot _ _]). Definition is_Rmodel X := orthonormal X /\ {subset X <= 'Z[irr G]}. Inductive model := Model bb f X of is_Lmodel bb f & is_Rmodel X. @@ -486,13 +488,13 @@ have lt_ks k: k \in ks -> (k < size m)%N by case/mapP=> kv /clP[ltk _] ->. have sAm: {subset Aij <= (m : seq _)} by move=> _ /mapP[k /lt_ks ltk ->]; rewrite mem_nth. have o1Aij: orthonormal Aij. - have [Um _] := orthonormalP o1m; apply: sub_orthonormal o1m => //. + have [Um _] := orthonormalP _ _ o1m; apply: sub_orthonormal o1m => //. rewrite map_inj_in_uniq // => k1 k2 /lt_ks ltk1 /lt_ks ltk2 /eqP. by apply: contraTeq; rewrite nth_uniq. -have [X AijX [Y [defXY oXY oYij]]] := orthogonal_split Aij beta. +have [X AijX [Y [defXY oXY oYij]]] := orthogonal_split [dot of @cfdot _ _] Aij beta. have{AijX} defX: X = \sum_(xi <- Aij) '[beta, xi] *: xi. have [_ -> ->] := orthonormal_span o1Aij AijX; apply: eq_big_seq => xi CFxi. - by rewrite defXY cfdotDl (orthoPl oYij) ?addr0. + by rewrite defXY linearDl /= (orthoPl [dot of @cfdot _ _] _ _ oYij) ?addr0. have ->: eval_cl m kvs = X. rewrite {}defX !big_map; apply: eq_big_seq => kv /clP[_ /eqP->]. by rewrite scaler_int. @@ -504,13 +506,13 @@ have <-: '[X] = norm%:R. by rewrite !big_map; apply: eq_big_seq => kv /clP[_ /eqP->]. rewrite unlock /=; elim: (kvs) => //= [[k v] kvs' ->]. by rewrite -intr_norm -natrX -natrD. -rewrite defXY cfnormDd //; split; first by rewrite ler_paddr ?cfnorm_ge0. +rewrite defXY hnormDd //; split; first by rewrite ler_paddr ?cfnorm_ge0. by rewrite eq_sym addrC -subr_eq0 addrK cfnorm_eq0 => /eqP->; rewrite addr0. have{ZmL} Zbeta: beta \in 'Z[irr G] by apply: ZmL. have Z_X: X \in 'Z[irr G]. rewrite defX big_seq rpred_sum // => xi /sAm/ZmR Zxi. by rewrite rpredZ_Cint ?Cint_cfdot_vchar. -rewrite -ltr_subl_addl subrr cnorm_dconstt; last first. +rewrite -ltr_subl_addl subrr /= cnorm_dconstt; last first. by rewrite -[Y](addKr X) -defXY addrC rpredB. have [-> | [dk Ydk] _ /eqP sz_kvs] := set_0Vmem (dirr_constt Y). by rewrite big_set0 ltrr. @@ -518,14 +520,14 @@ have Dks: ks =i iota 0 (size m). have: {subset ks <= iota 0 (size m)} by move=> k /lt_ks; rewrite mem_iota. by case/leq_size_perm=> //; rewrite size_iota size_map sz_kvs. suffices o_dk_m: orthogonal (dchi dk) m. - exists dk; rewrite // dirr_consttE defX cfdotDl cfdot_suml. - rewrite big1_seq ?add0r -?dirr_consttE // => xi /sAm CFxi. - by rewrite cfdotC cfdotZr (orthoPl o_dk_m) // mulr0 conjC0. -apply/orthoPl=> _ /(nthP 0)[k ltk <-]; have [Um o_m] := orthonormalP o1m. + exists dk; rewrite // dirr_consttE defX linearDl linear_suml. + rewrite big1_seq ?add0r -?dirr_consttE // => xi /sAm CFxi /=. + by rewrite hermC linearZ /= (orthoPl [dot of @cfdot _ _] _ _ o_dk_m) // mulr0 conjC0 mulr0. +apply/orthoPl=> _ /(nthP 0)[k ltk <-]; have [Um o_m] := orthonormalP [dot of @cfdot _ _] _ o1m. have Z1k: m`_k \in dirr G by rewrite dirrE ZmR ?o_m ?eqxx ?mem_nth. -apply: contraTeq Ydk => /eqP; rewrite dirr_consttE cfdot_dirr ?dirr_dchi //. -have oYm: '[Y, m`_k] = 0 by rewrite (orthoPl oYij) ?map_f // Dks mem_iota. -by do 2?case: eqP => [-> | _]; rewrite // ?cfdotNr oYm ?oppr0 ltrr. +apply: contraTeq Ydk => /eqP; rewrite dirr_consttE /= cfdot_dirr ?dirr_dchi //. +have oYm: '[Y, m`_k] = 0 by rewrite (orthoPl [dot of @cfdot _ _] _ _ oYij) ?map_f // Dks mem_iota. +by do 2?case: eqP => [-> | _]; rewrite // ?linearNr /= oYm ?oppr0 ltrr. Qed. Lemma norm_cl_eq3 m th cl : @@ -613,20 +615,20 @@ have: goal (s1%:~R + '[m ij1, eval_cl m kvs]) (if cl1eq then 0%N else s2). apply/implyP=> /(norm_cl_eq3 m_th th_cl2) <-. by rewrite if_same Dm // addrK normr0. have /allP: {subset kvs <= kvs2} by []. -rewrite cfdot_sumr unlock; elim: kvs s1 s2 => [|[k v2] kvs IHkvs] s1 s2 /=. +rewrite linear_sumr unlock; elim: kvs s1 s2 => [|[k v2] kvs IHkvs] s1 s2 /=. by rewrite addr0 /goal -rmorphB pmulrn -!CintrE. case/andP=> kvs2_v /IHkvs{IHkvs}IHkvs; have{cl2P} [ltk _] := cl2P _ kvs2_v. have [v1 /cl1P[_ /eqP/=Dv1] | kvs1'k] := get_litP. rewrite addrA => gl12; apply: IHkvs; congr (goal (_ + _) _): gl12. by rewrite raddfMz addrC /= Dv1 -mulrzA -rmorphD. move=> gl12; apply: IHkvs; case: ifP gl12 => [/(norm_cl_eq3 m_th th_cl1)->|_]. - rewrite cfdot_suml big1_seq ?add0r //= => kv1 kvs1_kv1. + rewrite linear_suml big1_seq ?add0r //= => kv1 kvs1_kv1. have [[ltk1 _] [/orthonormalP[Um oom] _]] := (cl1P _ kvs1_kv1, RmodelP m). - rewrite -!scaler_int cfdotZl cfdotZr oom ?mem_nth ?nth_uniq // mulrb. - by rewrite ifN ?mulr0 //; apply: contraNneq kvs1'k => <-; apply: map_f. + rewrite -!scaler_int linearZ /= linearZl_LR /= oom //= ?mem_nth ?nth_uniq // mulrb. + by rewrite ifN ?[_ *: _]mulr0 ?mulr0 //; apply: contraNneq kvs1'k => <-; apply: map_f. rewrite /goal -(ler_add2r 1) -mulrSr; case: (cl2eq) => //; apply: ler_trans. set s := '[_, _]; rewrite -[_ + _](addrK s) (ler_trans (ler_norm_sub _ _)) //. -rewrite 2![_ + s]addrAC addrA ler_add2l {}/s -scaler_int cfdotZr rmorph_int. +rewrite 2![_ + s]addrAC addrA ler_add2l {}/s -scaler_int linearZ /= rmorph_int. have [|v1 _] := sat_cases k m_th th_cl1; first exact/andP. have [th1 -> /= [th1_cl1 _] m_th1] := ext_clP k v1 th_cl1. have [_ _ /(_ _ (mem_head _ _))[_ /eqP->]] := satP m_th1 _ th1_cl1. @@ -777,7 +779,7 @@ have{lesrk} ubk k: k \in sk -> (k < size m)%N by move=> /lesrk/leq_trans->. have smRP: is_Rmodel smR. have ssmR: {subset smR <= (m : seq _)}. by move=> _ /mapP[k s_k ->]; rewrite mem_nth ?ubk. - split=> [|xi /ssmR/ZmR//]; have [Um _] := orthonormalP o1m. + split=> [|xi /ssmR/ZmR//]; have [Um _] := orthonormalP _ _ o1m. apply: sub_orthonormal o1m; rewrite ?map_inj_in_uniq //. by apply: can_in_inj (index^~ m) _ => k s_k; rewrite /= index_uniq ?ubk. apply: (Uth2 (Model smLP smRP)); apply/satP=> [][[i2 j2] kvs2] /(allP sym12). @@ -923,13 +925,13 @@ Local Notation cfWVbase := cfCyclicTIsetBase. Let cfdot_alpha_w i1 j1 i2 j2 : i2 != 0 -> j2 != 0 -> '[alpha_ i1 j1, w_ i2 j2] = [&& i1 == i2 & j1 == j2]%:R. Proof. -move=> nzi2 nzj2; rewrite alphaE -w_00 !cfdotDl !cfdotNl !cfdot_w. +move=> nzi2 nzj2; rewrite alphaE -w_00 !linearDl !linearNl /= !cfdot_w. by rewrite !(eq_sym 0) (negPf nzi2) (negPf nzj2) /= andbF !subr0 add0r. Qed. Let cfdot_alpha_1 i j : i != 0 -> j != 0 -> '[alpha_ i j, 1] = 1. Proof. -move=> nzi nzj; rewrite alphaE -w_00 !cfdotDl !cfdotNl !cfdot_w. +move=> nzi nzj; rewrite alphaE -w_00 !linearDl !linearNl /= !cfdot_w. by rewrite !eqxx andbT /= (negPf nzi) (negPf nzj) addr0 !subr0. Qed. @@ -937,7 +939,7 @@ Let cfnorm_alpha i j : i != 0 -> j != 0 -> '[alpha_ i j] = 4%:R. Proof. move=> nzi nzj; rewrite -[4]/(size [:: 1; - w_ i 0; - w_ 0 j; w_ i j]). rewrite -cfnorm_orthonormal 3?big_cons ?big_seq1 ?addrA -?alphaE //. -rewrite /orthonormal -w_00 /= !cfdotNl !cfdotNr !opprK !oppr_eq0 !cfnorm_irr. +rewrite /orthonormal -w_00 /= !linearNl !linearNr !opprK !oppr_eq0 !cfnorm_irr /=. by rewrite !cfdot_w !eqxx /= !(eq_sym 0) (negPf nzi) (negPf nzj) !eqxx. Qed. @@ -947,10 +949,10 @@ apply/freeP=> s /= s_alpha_0 ij; case def_ij: (enum_val ij) => [i j]. have /andP[nzi nzj]: (i != 0) && (j != 0). by rewrite -!in_setC1 -in_setX -def_ij enum_valP. have:= congr1 (cfdotr (w_ i j)) s_alpha_0; rewrite raddf_sum raddf0 => <-. -rewrite (bigD1 ij) //= nth_image def_ij cfdotZl cfdot_alpha_w // !eqxx mulr1. +rewrite (bigD1 ij) //= nth_image def_ij linearZl_LR /= cfdot_alpha_w // !eqxx [_ *: _]mulr1. rewrite big1 ?addr0 // => ij1; rewrite nth_image -(inj_eq enum_val_inj) def_ij. case: (enum_val ij1) => i1 j1 /= => ne_ij1_ij. -by rewrite cfdotZl cfdot_alpha_w // mulr_natr mulrb ifN. +by rewrite linearZl_LR /= cfdot_alpha_w // [_ *: _]mulr_natr mulrb ifN. Qed. (* Further results on alpha_ depend on the assumption that W is cyclic. *) @@ -1286,11 +1288,11 @@ have o_beta_1 i j: i != 0 -> j != 0 -> '[beta i j, 1] = 0. have o_beta i1 j1 i2 j2 : i1 != 0 -> j1 != 0 -> i2 != 0 -> j2 != 0 -> '[beta i1 j1, beta i2 j2] = ((i1 == i2).+1 * (j1 == j2).+1 - 1)%:R. - move=> nzi1 nzj1 nzi2 nzj2; rewrite mulSnr addnS mulnSr /=. - rewrite cfdotBr o_beta_1 // subr0 cfdotBl (cfdotC 1) o_alphaG_1 //. - rewrite (normedTI_isometry tiV) ?cfCycTI_on // rmorph1 addrC. - rewrite (alphaE i2) cfdotDr !cfdotBr cfdot_alpha_1 // -!addrA addKr addrA. + rewrite linearBr /= o_beta_1 // subr0 linearBl /= (hermC _ 1) /= o_alphaG_1 //. + rewrite (normedTI_isometry tiV) ?cfCycTI_on // rmorph1 addrC /=. + rewrite (alphaE i2) linearDr !linearBr /= cfdot_alpha_1 // mulr1 -!addrA addKr addrA. rewrite addrC cfdot_alpha_w // subn1 -addnA !natrD mulnb; congr (_ + _). - rewrite alphaE -w_00 !(cfdotBl, cfdotDl) !cfdot_w !eqxx !(eq_sym 0). + rewrite alphaE -w_00 !(linearBl, linearDl) /= !cfdot_w !eqxx !(eq_sym 0). rewrite (negPf nzi1) (negPf nzj1) (negPf nzi2) (negPf nzj2) /= !andbF !andbT. by rewrite !addr0 !subr0 !opprB !subr0. pose beta_fun := [fun ij => beta (inord ij.1.+1) (inord ij.2.+1)]. @@ -1322,7 +1324,7 @@ have o_dchi i j dk1 dk2 (phi := beta i j): '[phi, dchi dk1] = 1 -> '[phi, dchi dk2] = 0 -> '[dchi dk1, dchi dk2] = 0. - move=> phi1 phi0; have /eqP: 1 != 0 :> algC := oner_neq0 _. rewrite -phi1 cfdot_dchi; do 2!case: eqP => [->|_]; rewrite ?subrr //. - by rewrite dchi_ndirrE cfdotNr phi0 oppr0. + by rewrite dchi_ndirrE linearNr /= phi0 oppr0. have [nzi01 nzj01] := (Iirr1_neq0 ntW1, Iirr1_neq0 ntW2). have X0j_1 j: j != 0 -> '[X0j j, 1] = 0. by move=> nzj; rewrite -dchi1 (o_dchi #1 j) ?betaX0j ?eqxx ?dchi1 ?o_beta_1. @@ -1340,32 +1342,33 @@ have Xi0_Xi0 i i0: i != 0 -> i0 != 0 -> '[Xi0 i, Xi0 i0] = (i == i0)%:R. by apply: (o_dchi i #1); rewrite ?betaXi0 ?eqxx ?(negPf i0'i). have oxi_00 i j: '[xi_ i j, xi_ 0 0] = ((i == 0) && (j == 0))%:R. rewrite /xi_; case: ifPn => [_ | nzi]. - by case: ifPn => [_ | nzj]; rewrite ?cfnorm1 // cfdotNl X0j_1 ?oppr0. - case: ifPn => [_ | nzj]; first by rewrite cfdotNl Xi0_1 ?oppr0. + by case: ifPn => [_ | nzj]; rewrite ?cfnorm1 // linearNl /= X0j_1 ?oppr0. + case: ifPn => [_ | nzj]; first by rewrite linearNl /= Xi0_1 ?oppr0. by rewrite 2!cfdotBl o_beta_1 ?X0j_1 ?Xi0_1 ?subr0. have oxi_0j i j j0: '[xi_ i j, xi_ 0 j0] = ((i == 0) && (j == j0))%:R. rewrite /xi_; have [-> | nzj0] := altP (j0 =P 0); first exact: oxi_00. - rewrite cfdotNr; case: ifPn => [_ | nzi]. - have [-> | nzj] := altP eqP; last by rewrite cfdotNl opprK X0j_X0j. - by rewrite cfdotC X0j_1 // conjC0 oppr0 mulrb ifN_eqC. - have [_ | nzj] := ifPn; first by rewrite cfdotNl Xi0_X0j ?oppr0. - by rewrite 2!cfdotBl Xi0_X0j // subr0 betaX0j ?X0j_X0j // subrr oppr0. + rewrite linearNr; case: ifPn => [_ | nzi]. + have [-> | nzj] := altP eqP; last by rewrite linearNl opprK /= X0j_X0j. + by rewrite /= hermC /= X0j_1 // conjC0 mulr0 oppr0 mulrb ifN_eqC. + have [_ | nzj] := ifPn; first by rewrite linearNl /= Xi0_X0j ?oppr0. + by rewrite 2!linearBl /= Xi0_X0j // subr0 betaX0j ?X0j_X0j // subrr oppr0. have{oxi_00} oxi_i0 i j i0: '[xi_ i j, xi_ i0 0] = ((i == i0) && (j == 0))%:R. rewrite /xi_; have [-> | nzi0] := altP (i0 =P 0); first exact: oxi_00. - rewrite cfdotNr andbC; have [_ | nzj] := boolP (j == 0). - have [-> | nzi] := altP eqP; last by rewrite cfdotNl opprK Xi0_Xi0. - by rewrite cfdotC Xi0_1 // conjC0 oppr0 mulrb ifN_eqC. - have [_ | nzi] := ifPn; first by rewrite cfdotNl opprK cfdotC Xi0_X0j ?conjC0. - rewrite 2!cfdotBl betaXi0 ?Xi0_Xi0 // subrr add0r opprK. - by rewrite cfdotC Xi0_X0j // conjC0. + rewrite linearNr andbC; have [_ | nzj] := boolP (j == 0). + have [-> | nzi] := altP eqP; last by rewrite linearNl opprK /= Xi0_Xi0. + by rewrite /= hermC /= Xi0_1 // conjC0 mulr0 oppr0 mulrb ifN_eqC. + have [_ | nzi] := ifPn. + by rewrite linearNl opprK /= hermC /= Xi0_X0j ?[_ *: _]mulr0 /= ?conjC0 ?mulr0. + rewrite 2!linearBl /= betaXi0 ?Xi0_Xi0 // subrr add0r opprK. + by rewrite hermC /= Xi0_X0j // conjC0 mulr0. have [-> | nzi2] := altP (i2 =P 0); first exact: oxi_0j. have [-> | nzj2] := altP (j2 =P 0); first exact: oxi_i0. -rewrite cfdotC eq_sym; apply: canLR (@conjCK _) _; rewrite rmorph_nat. +rewrite hermC eq_sym /= expr0 mul1r; apply: canLR (@conjCK _) _ ; rewrite rmorph_nat. have [-> | nzi1] := altP (i1 =P 0); first exact: oxi_0j. have [-> | nzj1] := altP (j1 =P 0); first exact: oxi_i0. have ->: xi_ i1 j1 = beta i1 j1 + xi_ i1 0 + xi_ 0 j1 by rewrite /xi_ !ifN. -rewrite 2!cfdotDr oxi_i0 oxi_0j andbC /xi_ (negPf nzi2) (negPf nzj2) !addr0. -rewrite eq_sym xpair_eqE cfdotC 2!cfdotBr o_beta // betaXi0 ?betaX0j //. +rewrite 2!linearDr /= oxi_i0 oxi_0j andbC /xi_ (negPf nzi2) (negPf nzj2) !addr0. +rewrite eq_sym xpair_eqE hermC expr0 mul1r /= 2!linearBr /= o_beta // betaXi0 ?betaX0j //. by rewrite -!CintrE /= rmorph_int; do 2!case: (_ == _). Qed. @@ -1378,14 +1381,14 @@ Theorem cyclicTIiso_exists : & {in 'CF(W, V), forall phi : 'CF(W), sigma phi = 'Ind[G] phi}]}. Proof. pose sigmaVP f := ('CF(W, V) <= lker (linfun f - linfun 'Ind[G]))%VS. -pose sigmaP f := [&& orthonormal (map f (irr W)), f 1 == 1 & sigmaVP f]. +pose sigmaP f := [&& orthonormal [hermitian of @cfdot _ _] (map f (irr W)), f 1 == 1 & sigmaVP f]. pose sigma_base f := [seq (dchi (f k) : 'CF(G)) | k : Iirr W]. pose sigma_spec f := sigmaP (sval (linear_of_free (irr W) (sigma_base f))). suffices /sigW[f /and3P[]]: exists f : {ffun _}, sigma_spec f. case: linear_of_free => /=sigma Dsigma o1sigma /eqP sigma1 /eqlfun_inP sigmaV. exists (linfun sigma); split=> [|| phi /sigmaV]; try by rewrite !lfunE. do [rewrite size_map !size_tuple => /(_ (irr_free W) (card_ord _))] in Dsigma. - have [inj_sigma dot_sigma] := orthonormalP o1sigma. + have [inj_sigma dot_sigma] := orthonormalP _ _ o1sigma. rewrite -(map_tnth_enum (irr W)) -map_comp in Dsigma inj_sigma. move/eq_in_map in Dsigma; move/injectiveP in inj_sigma. split=> [|_ /zchar_tuple_expansion[z Zz ->]]. @@ -1429,9 +1432,11 @@ Proof. by case: cycTI_Zisometry. Qed. Lemma cycTIisometry : isometry sigma. Proof. move=> phi psi; have [[a ->] [b ->]] := (cfun_irr_sum phi, cfun_irr_sum psi). -rewrite !linear_sum !cfdot_suml; apply: eq_bigr => i _. -rewrite !cfdot_sumr; apply: eq_bigr => j _. -by rewrite !linearZ !cfdotZl !cfdotZr /= Isigma ?irr_vchar. + + +rewrite /= 2!linear_sum !linear_suml /=; apply: eq_bigr => i _. +rewrite !linear_sumr; apply: eq_bigr => j _ /=. +by rewrite !linearZ /= !linearZl_LR /= Isigma ?irr_vchar. Qed. Lemma cycTIiso_vchar i j : eta_ i j \in 'Z[irr G]. @@ -1439,15 +1444,15 @@ Proof. by rewrite Zsigma ?irr_vchar. Qed. Lemma cfdot_cycTIiso i1 i2 j1 j2 : '[eta_ i1 j1, eta_ i2 j2] = ((i1 == i2) && (j1 == j2))%:R. -Proof. by rewrite cycTIisometry. Qed. +Proof. by rewrite cycTIisometry /=. Qed. Lemma cfnorm_cycTIiso i j : '[eta_ i j] = 1. -Proof. by rewrite cycTIisometry cfnorm_irr. Qed. +Proof. by rewrite cycTIisometry /= cfnorm_irr. Qed. Lemma cycTIiso_dirr i j : eta_ i j \in dirr G. Proof. by rewrite dirrE cycTIiso_vchar /= cfnorm_cycTIiso. Qed. -Lemma cycTIiso_orthonormal : orthonormal im_sigma. +Lemma cycTIiso_orthonormal : orthonormal [hermitian of @cfdot _ _] im_sigma. Proof. by rewrite map_orthonormal ?irr_orthonormal. Qed. Lemma cycTIiso_eqE i1 i2 j1 j2 : @@ -1460,7 +1465,7 @@ Qed. Lemma cycTIiso_neqN i1 i2 j1 j2 : (eta_ i1 j1 == - eta_ i2 j2) = false. Proof. rewrite -addr_eq0; apply/eqP=> /(congr1 (cfdot (eta_ i1 j1)))/eqP. -by rewrite cfdot0r cfdotDr !cfdot_cycTIiso !eqxx -mulrS pnatr_eq0. +by rewrite cfdot0r linearDr /= !cfdot_cycTIiso !eqxx -mulrS pnatr_eq0. Qed. Lemma cycTIiso1 : sigma 1 = 1. @@ -1471,10 +1476,10 @@ Proof. by rewrite [sigma]unlock; case: cyclicTIiso_exists => ? []. Qed. Let sigma_Res_V : [/\ forall phi, {in V, sigma phi =1 phi} - & forall psi : 'CF(G), orthogonal psi im_sigma -> {in V, psi =1 \0}]. + & forall psi : 'CF(G), orthogonal [hermitian of @cfdot _ _] psi im_sigma -> {in V, psi =1 \0}]. Proof. have sigW i j : '[sigma 'chi_i, sigma 'chi_j] = (i == j)%:R. - by rewrite cycTIisometry cfdot_irr. + by rewrite cycTIisometry /= cfdot_irr. have [j | sigmaV sigma'V] := equiv_restrict_compl_ortho sWG nsVW cfWVbasis sigW. rewrite /= -/cfWVbase -(eq_bigr _ (fun _ _ => linearZ _ _)) /= -linear_sum. rewrite -cfun_sum_cfdot cycTIiso_Ind //. @@ -1491,7 +1496,7 @@ Proof. by case: sigma_Res_V. Qed. (* This is Peterfalvi, Theorem (3.2)(e). *) Theorem ortho_cycTIiso_vanish (psi : 'CF(G)) : - orthogonal psi im_sigma -> {in V, forall x, psi x = 0}. + orthogonal [hermitian of @cfdot _ _] psi im_sigma -> {in V, forall x, psi x = 0}. Proof. by case: sigma_Res_V psi. Qed. (* This is PeterFalvi (3.7). *) @@ -1507,7 +1512,8 @@ have Vphi: phi \in 'CF(W, V). by rewrite addrC -[g]mulg1 /w_ !dprod_IirrE !cfDprodE ?lin_char1 ?addKr. by rewrite -[g]mul1g /w_ !dprod_IirrE !cfDprodE ?lin_char1 ?addrK. suffices: '[psi, 'Ind[G] phi] == 0. - rewrite -!cycTIiso_Ind // !linearB !linearD !cfdotBr !cfdotDr. + rewrite -!cycTIiso_Ind //. + rewrite !linearB /= !linearD /=. by rewrite -addrA -opprD subr_eq0 => /eqP. rewrite (cfdotEr _ (cfInd_on sWG Vphi)) big1 ?mulr0 //. by move=> _ /imset2P[x y Vx Gy ->]; rewrite cfunJ ?psiV_0 ?mul0r. @@ -1518,7 +1524,7 @@ Definition cyclicTI_NC phi := #|[set ij | '[phi, eta_ ij.1 ij.2] != 0]|. Local Notation NC := cyclicTI_NC. Lemma cycTI_NC_opp (phi : 'CF(G)) : (NC (- phi)%R = NC phi)%N. -Proof. by apply: eq_card=> [[i j]]; rewrite !inE cfdotNl oppr_eq0. Qed. +Proof. by apply: eq_card=> [[i j]]; rewrite !inE linearNl oppr_eq0. Qed. Lemma cycTI_NC_sign (phi : 'CF(G)) n : (NC ((-1) ^+ n *: phi)%R = NC phi)%N. Proof. @@ -1548,14 +1554,14 @@ Lemma cycTI_NC_dchi di : (NC (dchi di) <= 1)%N. Proof. by rewrite cycTI_NC_dirr ?dirr_dchi. Qed. Lemma cycTI_NC_0 : NC 0 = 0%N. -Proof. by apply: eq_card0 => ij; rewrite !inE cfdot0l eqxx. Qed. +Proof. by apply: eq_card0 => ij; rewrite !inE linear0l eqxx. Qed. Lemma cycTI_NC_add n1 n2 phi1 phi2 : (NC phi1 <= n1 -> NC phi2 <= n2 -> NC (phi1 + phi2)%R <= n1 + n2)%N. Proof. move=> ub1 ub2; apply: leq_trans {ub1 ub2}(leq_add ub1 ub2). rewrite -cardsUI -[NC _]addn0 leq_add // subset_leq_card //. -apply/subsetP=> [[i j]]; rewrite !inE /= -negb_and cfdotDl. +apply/subsetP=> [[i j]]; rewrite !inE /= -negb_and linearDl /=. by apply: contra => /andP[/eqP-> /eqP->]; rewrite addr0. Qed. @@ -1566,7 +1572,7 @@ Proof. by move=> ub1 ub2; rewrite cycTI_NC_add ?cycTI_NC_opp. Qed. Lemma cycTI_NC_scale_nz a phi : a != 0 -> NC (a *: phi) = NC phi. Proof. move=> nz_a; apply: eq_card => ij. -by rewrite !inE cfdotZl mulf_eq0 negb_or nz_a. +by rewrite !inE linearZl_LR mulf_eq0 negb_or nz_a. Qed. Lemma cycTI_NC_scale a phi n : (NC phi <= n -> NC (a *: phi) <= n)%N. @@ -1680,10 +1686,10 @@ pose phi := (-1) ^+ e *: phi0; pose psi := phi - rho. have{eq_phi_rho} psiV0 z: z \in V -> psi z = 0. by move=> Vz; rewrite !cfunE eq_phi_rho // !cfunE signrMK subrr. have{Zphi0} Zphi: phi \in 'Z[irr G] by rewrite rpredZsign. -have{n2phi0} n2phi: '[phi] = 2%:R by rewrite cfnorm_sign. +have{n2phi0} n2phi: '[phi] = 2%:R by rewrite hnorm_sign. have Zrho: rho \in 'Z[irr G] by rewrite rpredB ?cycTIiso_vchar. have n2rho: '[rho] = 2%:R. - by rewrite cfnormBd !cfdot_cycTIiso ?eqxx ?(negPf neq_j12) ?andbF. + by rewrite hnormBd /= !cfdot_cycTIiso ?eqxx ?(negPf neq_j12) ?andbF. have [oIphi _ Dphi] := dirr_small_norm Zphi n2phi isT. have [oIrho _ Drho] := dirr_small_norm Zrho n2rho isT. set Iphi := dirr_constt _ in oIphi Dphi. @@ -1704,7 +1710,7 @@ have rhoIdE s k: dchi (rhoId (s, k)) = (-1) ^+ s *: eta_ i k. rewrite eqEcard oIrho oIphi andbT -setD_eq0; apply/set0Pn=> [[dk1 phi'dk1]]. have [[rho_dk1 _] psi_k1_lt0] := (setDP phi'dk1, psi_phi'_lt0 _ phi'dk1). have dot_dk1: '[rho, dchi dk1] = 1. - rewrite Drho cfdot_suml (big_setD1 dk1) //= cfnorm_dchi big1 ?addr0 //. + rewrite Drho linear_suml (big_setD1 dk1) //= cfnorm_dchi big1 ?addr0 //. move=> dk2 /setD1P[/negPf dk1'2 /dirr_constt_oppl]; rewrite cfdot_dchi dk1'2. by case: eqP => [-> /negP[] | _ _]; rewrite ?subrr ?ndirrK. have dot_dk2: 0 < '[rho, rho - dchi dk1]. @@ -1717,7 +1723,7 @@ have{dot_dk1 dot_dk2} [s [k Dk1 rho_k2]]: try apply: dirr_inj; rewrite ?dirr_consttE rhoIdE scaler_sign //=. + by rewrite addrC Dk1 addKr in dot_dk2. by rewrite Dk1 addrK in dot_dk2. -rewrite -Dk1 rhoIdE cfdotZr rmorph_sign in psi_k1_lt0. +rewrite -Dk1 rhoIdE linearZ /= rmorph_sign in psi_k1_lt0. have psi_k1_neq0: '[psi, eta_ i k.1] != 0. by rewrite -(can_eq (signrMK s)) mulr0 ltr_eqF. set dk2 := rhoId _ in rho_k2. @@ -1726,7 +1732,7 @@ have NCk2'_le1 (dI : {set _}): - rewrite (cardsD1 dk2) => -> /eqP/cards1P[dk ->]. by rewrite big_set1 cycTI_NC_dirr ?dirr_dchi. suffices /psi_phi'_lt0/ltr_geF/idP[]: dk2 \in Irho :\: Iphi. - rewrite rhoIdE cfdotZr signrN rmorphN mulNr oppr_ge0 rmorph_sign. + rewrite rhoIdE linearZ signrN /= rmorphN mulNr oppr_ge0 rmorph_sign. have := small_cycTI_NC psiV0 NCpsi psi_k1_neq0. by case=> // ->; rewrite mulrCA nmulr_lle0 ?ler0n. have: (1 + 1 < NC psi)%N. diff --git a/theories/PFsection4.v b/theories/PFsection4.v index f954e58..cc56b7a 100644 --- a/theories/PFsection4.v +++ b/theories/PFsection4.v @@ -10,7 +10,7 @@ Require Import morphism perm automorphism quotient action gfunctor gproduct. From mathcomp Require Import center commutator zmodp cyclic pgroup nilpotent hall frobenius. From mathcomp -Require Import matrix mxalgebra mxrepresentation vector ssrnum algC classfun. +Require Import matrix mxalgebra mxrepresentation vector ssrnum algC forms classfun. From mathcomp Require Import character inertia vcharacter. From odd_order @@ -75,6 +75,9 @@ Section Four_1_to_2. Variable gT : finGroupType. +Notation orthonormal := (orthonormal [hermitian of @cfdot _ _]). +Notation orthonormal_cat := (orthonormal_cat [dot of @cfdot _ _]). + Lemma vchar_pairs_orthonormal (X : {group gT}) (a b c d : 'CF(X)) u v : {subset (a :: b) <= 'Z[irr X]} /\ {subset (c :: d) <= 'Z[irr X]} -> orthonormal (a :: b) && orthonormal (c :: d) -> @@ -96,9 +99,9 @@ wlog suff: a b c d u v Za Zb Zc Zd o_ab o_cd r_u r_v nz_u nz_v o_abcd ab1 cd1 / have vc_sym (e f : 'CF(X)) : ((e - f) 1%g == 0) = ((f - e) 1%g == 0). by rewrite -opprB cfunE oppr_eq0. have ab_sym e: ('[b - a, e] == 0) = ('[a - b, e] == 0). - by rewrite -opprB cfdotNl oppr_eq0. + by rewrite -opprB linearNl oppr_eq0. rewrite (IH b a c d u v) // 1?osym2 1?vc_sym ?ab_sym //=. - rewrite -oppr_eq0 -cfdotNr opprB in o_abcd. + rewrite -oppr_eq0 -linearNr opprB in o_abcd. by rewrite (IH a b d c v u) ?(IH b a d c v u) // 1?osym2 1?vc_sym ?ab_sym. apply: contraLR cd1 => nz_ac. have [/orthonormal2P[ab0 a1 b1] /orthonormal2P[cd0 c1 d1]] := (o_ab, o_cd). @@ -106,13 +109,13 @@ have [ea [ia def_a]] := vchar_norm1P Za a1. have{nz_ac} [e defc]: exists e : bool, c = (-1) ^+ e *: a. have [ec [ic def_c]] := vchar_norm1P Zc c1; exists (ec (+) ea). move: nz_ac; rewrite def_a def_c scalerA; rewrite -signr_addb addbK. - rewrite cfdotZl cfdotZr cfdot_irr mulrA mulrC mulf_eq0. + rewrite linearZ /= linearZl_LR /= cfdot_irr mulrA mulrC mulf_eq0. by have [-> // | _]:= ia =P ic; rewrite eqxx. have def_vbd: v * '[b, d]_X = - ((-1) ^+ e * u). - apply/eqP; have:= o_abcd; rewrite cfdotDl cfdotNl !raddfB /=. - rewrite defc !cfdotZr a1 (cfdotC b) ab0 rmorph0 mulr1. + apply/eqP; have:= o_abcd; rewrite linearDl linearNl !raddfB /=. + rewrite defc !linearZ /= a1 (cfdotC b) ab0 rmorph0 mulr1. rewrite -[a]scale1r -{2}[1]/((-1) ^+ false) -(addbb e) signr_addb -scalerA. - rewrite -defc cfdotZl cd0 !mulr0 opprK addrA !subr0 mulrC addrC addr_eq0. + rewrite -defc linearZl_LR /= cd0 ![_ *: _]mulr0 !mulr0 opprK addrA !subr0 mulrC addrC addr_eq0. by rewrite rmorph_sign !conj_Creal. have nz_bd: '[b, d] != 0. move/esym/eqP: def_vbd; apply: contraTneq => ->. @@ -120,9 +123,9 @@ have nz_bd: '[b, d] != 0. have{nz_bd} defd: d = '[b, d] *: b. move: nz_bd; have [eb [ib ->]] := vchar_norm1P Zb b1. have [ed [id ->]] := vchar_norm1P Zd d1. - rewrite scalerA cfdotZl cfdotZr rmorph_sign mulrA cfdot_irr. + rewrite scalerA linearZ /= linearZl_LR /=rmorph_sign mulrA cfdot_irr. have [-> _ | _] := ib =P id; last by rewrite !mulr0 eqxx. - by rewrite mulr1 mulrAC -!signr_addb addbb. + by rewrite mulr1 -mulrA -!signr_addb addbb; case:ed. rewrite defd scalerA def_vbd scaleNr opprK defc scalerA mulrC -raddfD cfunE. rewrite !mulf_neq0 ?signr_eq0 // -(subrK a b) -opprB addrCA 2!cfunE. rewrite (eqP ab1) oppr0 add0r cfunE -mulr2n -mulr_natl mulf_eq0 pnatr_eq0. @@ -306,7 +309,8 @@ have /fin_all_exists2[dmu injl_mu Ddmu] j: move/(zchar_subset irrSj)/(zchar_onS (setDS W (sub1G W2))). by rewrite !zcharD1E cfInd1 // mulf_eq0 orbC => /andP[/cfInd_vchar-> // ->]. case/vchar_isometry_base=> // [|||i|mu Umu [d Ddmu]]; first by rewrite NirrW1. - + rewrite orthonormal_free // (sub_orthonormal irrSj) ?irr_orthonormal //. + + rewrite (@orthonormal_free _ _ [dot of @cfdot _ _]) // (sub_orthonormal irrSj) + ?irr_orthonormal //. by apply/injectiveP=> i1 i2 /irr_inj/dprod_Iirr_inj[]. + by move=> _ /mapP[i _ ->]; rewrite Sj0 !lin_char1. + by rewrite nth_mktuple Sj0 V2ew. @@ -323,19 +327,20 @@ have{injl_mu} inj_Imu: injective Imu. have [-> /injl_mu-> // | j2'1 /eqP/negPf[] /=] := eqVneq j1 j2. apply/(can_inj oddb)/eqP; rewrite -eqC_nat -cfdot_irr -!/(mu _ _) mulr0n. have oIew_j12 i k: '['Ind[L] (ew_ i j1), 'Ind[L] (ew_ k j2)] = 0. - by rewrite isoV2 // cfdotBl !cfdotBr !cfdot_w (negPf j2'1) !andbF !subr0. + by rewrite isoV2 // linearBl !linearBr /= !cfdot_w (negPf j2'1) !andbF !subr0. have defSd i j k: mu i j - mu k j = d j *: ('Ind (ew_ i j) - 'Ind (ew_ k j)). by rewrite !Ddmu -scalerBr signrZK opprB addrA subrK. have Sd1 i j k: (mu i j - mu k j) 1%g == 0. by rewrite defSd !(cfunE, cfInd1) ?lin_char1 // !subrr mulr0. - have exS i j: {k | {subset S i j k <= 'Z[irr L]} & orthonormal (S i j k)}. + have exS i j: {k | {subset S i j k <= 'Z[irr L]} & orthonormal [dot of @cfdot _ _] (S i j k)}. have:= w1gt1; rewrite -nirrW1 (cardD1 i) => /card_gt0P/sigW[k /andP[i'k _]]. exists k; first by apply/allP; rewrite /= !irr_vchar. apply/andP; rewrite /= !cfdot_irr !eqxx !andbT /=. by rewrite (inj_eq (injl_mu j)) mulrb ifN_eqC. have [[k1 ZS1 o1S1] [k2 ZS2 o1S2]] := (exS i1 j1, exS i2 j2). rewrite (orthonormal_vchar_diff_ortho (conj ZS1 ZS2)) ?o1S1 ?Sd1 ?andbT //. - by rewrite !defSd cfdotZl cfdotZr cfdotBl !cfdotBr !oIew_j12 !subrr !mulr0. + by rewrite !defSd linearZ /= linearZl_LR /= linearBl /= !linearBr /= !oIew_j12 !subrr + [_ *: _]mulr0 mulr0. pose V2base := [tuple of [seq ew_ ij.1 ij.2 | ij in predX (predC1 0) predT]]. have V2basis: basis_of 'CF(W, W :\: W2) V2base. suffices V2free: free V2base. @@ -345,20 +350,21 @@ have V2basis: basis_of 'CF(W, W :\: W2) V2base. by apply/span_subvP=> _ /mapP[ij _ ->]. apply/freeP=> /= z zV2e0 k. move Dk: (enum_val k) (enum_valP k) => [i j] /andP[/= nz_i _]. - rewrite -(cfdot0l (w_ i j)) -{}zV2e0 cfdot_suml (bigD1 k) //= cfdotZl. - rewrite nth_image Dk cfdotBl !cfdot_w !eqxx eq_sym (negPf nz_i) subr0 mulr1. +have -> : 0 = '[0,(w_ i j)] by rewrite linear0l. + rewrite -{}zV2e0 linear_suml (bigD1 k) //= linearZl_LR /=. + rewrite nth_image Dk linearBl /= !cfdot_w !eqxx eq_sym (negPf nz_i) subr0 [_ *: _]mulr1. rewrite big1 ?addr0 // => k1; rewrite -(inj_eq enum_val_inj) {}Dk nth_image. case: (enum_val k1) => /= i1 j1 ij'ij1. - rewrite cfdotZl cfdotBl !cfdot_dprod_irr [_ && _](negPf ij'ij1). - by rewrite eq_sym (negPf nz_i) subr0 mulr0. + rewrite linearZl_LR /= linearBl /= !cfdot_dprod_irr [_ && _](negPf ij'ij1). + by rewrite eq_sym (negPf nz_i) subr0 [_ *: _]mulr0. have nsV2W: W :\: W2 <| W by rewrite -sub_abelian_normal ?subsetDl. pose muW k := let: ij := inv_dprod_Iirr defW k in d ij.2 *: mu ij.1 ij.2. have inW := codomP (dprod_Iirr_onto defW _). have ImuW k1 k2: '[muW k1, muW k2] = (k1 == k2)%:R. have [[[i1 j1] -> {k1}] [[i2 j2] -> {k2}]] := (inW k1, inW k2). - rewrite cfdotZl cfdotZr !dprod_IirrK (can_eq (dprod_IirrK _)) /= rmorph_sign. + rewrite linearZ /= linearZl_LR /= !dprod_IirrK (can_eq (dprod_IirrK _)) /= rmorph_sign. rewrite cfdot_irr (inj_eq inj_Imu (_, _) (_, _)) -/(d _). - by case: eqP => [[_ ->] | _]; rewrite ?signrMK ?mulr0. + by case: eqP => [[_ ->] | _]; rewrite ?signrMK ?[_ *:_]mulr0 ?mulr0. have [k|muV2 mu'V2] := equiv_restrict_compl_ortho sWL nsV2W V2basis ImuW. rewrite nth_image; case: (enum_val k) (enum_valP k) => /= i j /andP[/= nzi _]. pose inWj i1 := dprod_Iirr defW (i1, j); rewrite (bigD1 (inWj 0)) //=. @@ -366,7 +372,7 @@ have [k|muV2 mu'V2] := equiv_restrict_compl_ortho sWL nsV2W V2basis ImuW. rewrite /= big1 ?addr0 => [|k1 /andP[]]; last first. rewrite !(eq_sym k1); have [[i1 j1] -> {k1}] := inW k1. rewrite !(can_eq (dprod_IirrK _)) => ij1'i ij1'0. - by rewrite cfdotBl !cfdot_w !mulrb !ifN // subrr scale0r. + by rewrite linearBl /= !cfdot_w !mulrb !ifN // subrr scale0r. rewrite /muW !dprod_IirrK /= addrC !cfdotBl !cfdot_w !eqxx /= !andbT. by rewrite eq_sym (negPf nzi) subr0 add0r scaleNr !scale1r -scalerBr. have Dsigma i j: sigma (w_ i j) = d j *: mu i j. @@ -383,7 +389,7 @@ split=> [[i1 j1] [i2 j2] | i j | i j | i j x V2x | k mu2p'k]. - by rewrite -Dmu -Dd -Dsigma. - by rewrite cfunE -muV2 // /muW dprod_IirrK Dd cfunE signrMK -Dmu. apply: mu'V2 => k1; have [[i j] ->{k1}] := inW k1. -apply: contraNeq mu2p'k; rewrite cfdotZr rmorph_sign mulf_eq0 signr_eq0 /=. +apply: contraNeq mu2p'k; rewrite linearZ /= rmorph_sign mulf_eq0 signr_eq0 /=. rewrite /mu Dmu dprod_IirrK -irr_consttE constt_irr inE /= => /eqP <-. exact: codom_f. Qed. @@ -453,14 +459,14 @@ Qed. Lemma cfdot_prTIirr_red i j k : '[mu2_ i j, mu_ k] = (j == k)%:R. Proof. -rewrite cfdot_sumr (bigD1 i) // cfdot_prTIirr eqxx /=. +rewrite linear_sumr (bigD1 i) //= cfdot_prTIirr eqxx /=. rewrite big1 ?addr0 // => i1 neq_i1i. by rewrite cfdot_prTIirr eq_sym (negPf neq_i1i). Qed. Lemma cfdot_prTIred j1 j2 : '[mu_ j1, mu_ j2] = ((j1 == j2) * w1)%:R. Proof. -rewrite cfdot_suml (eq_bigr _ (fun i _ => cfdot_prTIirr_red i _ _)) sumr_const. +rewrite linear_suml (eq_bigr _ (fun i _ => cfdot_prTIirr_red i _ _)) sumr_const. by rewrite mulrnA card_Iirr_cyclic. Qed. @@ -581,8 +587,8 @@ pose psi := 'Ind 'chi_k - mu_ j; have Npsi: psi \is a character. rewrite rmorph_nat -natrB ?Cnat_nat // eqxx lt0n -eqC_nat -Da. by rewrite -irr_consttE constt_Ind_Res Dl cfRes_prTIirr_eq0. rewrite negb_exists => /forallP muj'l. - rewrite cfdot_suml big1 ?subr0 // => i _. - rewrite cfdot_irr -(inj_eq irr_inj) mulrb ifN_eqC ?muj'l //. + rewrite linear_suml big1 ?subr0 // => i _. + rewrite /= cfdot_irr -(inj_eq irr_inj) mulrb ifN_eqC ?muj'l //. have ub_mu_1: mu_ j 1%g <= 'Ind[L] 'chi_k 1%g ?= iff ('Ind 'chi_k == mu_ j). rewrite -subr_eq0 -/psi (canRL (subrK _) (erefl psi)) cfunE -lerif_subLR. by rewrite subrr -char1_eq0 // eq_sym; apply: lerif_eq; rewrite char1_ge0. @@ -679,8 +685,8 @@ have [k] := constt_cfRes_irr K ell; rewrite -constt_Ind_Res => kLell. have [[j Dk] | [/irrP/sig_eqW[l1 DkL] chi'k]] := prTIres_irr_cases k. have [i /=/eqP <- | mu2j'l] := pickP (fun i => mu2_ i j == phi). by left; exists i, j. - case/eqP: kLell; rewrite Dk cfInd_prTIres cfdot_suml big1 // => i _. - by rewrite cfdot_irr -(inj_eq irr_inj) mu2j'l. + case/eqP: kLell; rewrite Dk cfInd_prTIres linear_suml big1 // => i _. + by rewrite /= cfdot_irr -(inj_eq irr_inj) mu2j'l. right; exists k; last by move: kLell; rewrite DkL constt_irr inE => /eqP <-. apply/codomP=> [[j Dk]]; have/negP[] := prTIred_not_irr j. by rewrite -cfInd_prTIres -Dk DkL mem_irr. @@ -881,7 +887,7 @@ have Zmu2: dmu2 \in 'Z[irr L, A0]. by rewrite zchar_split rpredB ?irr_vchar ?prDade_sub_TIirr_on. apply: eq_signed_sub_cTIiso => // [||x Vx]. - exact: zcharW (Ztau _ Zmu2). -- rewrite Itau // cfnormBd ?cfnorm_irr // (cfdot_prTIirr ptiWL). +- rewrite Itau // hnormBd /= ?cfnorm_irr //= (cfdot_prTIirr ptiWL). by rewrite (negPf k'j) andbF. have V2x: x \in W :\: W2 by rewrite (subsetP _ x Vx) // setDS ?subsetUr. rewrite !(cfunE, Dade_id) ?(cycTIiso_restrict _ _ Vx) //; last first. @@ -895,6 +901,8 @@ rewrite subDset setUC -subDset setDE setCK setIC -(dprod_modr defW sW2K). by rewrite coprime_TIg // dprod1g subsetUr. Qed. +Notation pairwise_orthogonal := (pairwise_orthogonal [hermitian of @cfdot _ _]). + (* This is Peterfalvi (4.9). *) (* We have added the "obvious" fact that calT is pairwise orthogonal, since *) (* we require this to prove membership in 'Z[calT], we encapsulate the *) @@ -917,7 +925,7 @@ have oo_mu: pairwise_orthogonal (codom mu_). apply/pairwise_orthogonalP; split=> [|_ _ /codomP[j1 ->] /codomP[j2 ->]]. apply/andP; split; last by apply/injectiveP; apply: prTIred_inj. by apply/codomP=> [[i /esym/eqP/idPn[]]]; apply: prTIred_neq0. - by rewrite cfdot_prTIred; case: (j1 =P j2) => // -> /eqP. + by rewrite /= cfdot_prTIred; case: (j1 =P j2) => // -> /eqP. have real'T: ~~ has cfReal calT. by apply/hasPn=> _ /imageP[j /andP[nzj _] ->]; apply: prTIred_not_real. have ccT: cfConjC_closed calT. @@ -944,8 +952,8 @@ have f1mu j: f1 (mu_ j) = f0 j. have iso_f1: {in codom mu_, isometry f1, to 'Z[irr G]}. split=> [_ _ /codomP[j1 ->] /codomP[j2 ->] | _ /codomP[j ->]]; last first. by rewrite f1mu rpredZsign rpred_sum // => i _; apply: cycTIiso_vchar. - rewrite !f1mu cfdotZl cfdotZr rmorph_sign signrMK !cfdot_suml. - apply: eq_bigr => i1 _; rewrite !cfdot_sumr; apply: eq_bigr => i2 _. + rewrite !f1mu linearZl_LR /= linearZ /= rmorph_sign signrMK !linear_suml /=. + apply: eq_bigr => i1 _; rewrite !linear_sumr /=; apply: eq_bigr => i2 _. by rewrite cfdot_cycTIiso cfdot_prTIirr. have [tau1 Dtau1 Itau1] := Zisometry_of_iso (orthogonal_free oo_mu) iso_f1. exists tau1 => [j|]; first by rewrite Dtau1 ?codom_f ?f1mu. diff --git a/theories/PFsection5.v b/theories/PFsection5.v index 6a57291..ee21f9f 100644 --- a/theories/PFsection5.v +++ b/theories/PFsection5.v @@ -12,10 +12,11 @@ Require Import gfunctor gproduct cyclic pgroup frobenius. From mathcomp Require Import matrix mxalgebra mxrepresentation vector ssrint. From mathcomp -Require Import ssrnum algC classfun character inertia vcharacter. +Require Import ssrnum algC forms classfun character inertia vcharacter. From odd_order Require Import PFsection1 PFsection2 PFsection3 PFsection4. + (******************************************************************************) (* This file covers Peterfalvi, Section 5: Coherence. *) (* Defined here: *) @@ -160,7 +161,7 @@ move=> _ _ /seqIndP[i _ ->] /seqIndP[j _ ->]. by case: ifP (cfclass_Ind_cases i j nsKL) => // _ -> /eqP. Qed. -Lemma seqInd_orthogonal : pairwise_orthogonal S. +Lemma seqInd_orthogonal : pairwise_orthogonal [hermitian of @cfdot _ _] S. Proof. apply/pairwise_orthogonalP; split; last exact: seqInd_ortho. by rewrite /= undup_uniq andbT; move/memPn: seqInd_neq0. @@ -365,7 +366,7 @@ Qed. Lemma seqInd_ortho_cfuni : {in S, forall phi, '[phi, '1_K] = 0}. Proof. move=> phi /seqInd_ortho_Ind1/eqP; apply: contraTeq => not_o_phi_1K. -by rewrite cfInd_cfun1 // cfdotZr rmorph_nat mulf_neq0. +by rewrite cfInd_cfun1 // linearZ /= rmorph_nat mulf_neq0. Qed. Lemma seqInd_ortho_1 : {in S, forall phi, '[phi, 1] = 0}. @@ -421,9 +422,9 @@ Qed. Variable chi : 'CF(L). Hypotheses (irr_chi : chi \in irr L) (Schi : chi \in S). -Lemma seqInd_conjC_ortho2 : orthonormal (chi :: chi^*)%CF. +Lemma seqInd_conjC_ortho2 : orthonormal [hermitian of @cfdot _ _] (chi :: chi^*)%CF. Proof. -by rewrite /orthonormal/= cfnorm_conjC irrWnorm ?seqInd_conjC_ortho ?eqxx. +by rewrite /orthonormal/= cfdot_cfAut // irrWnorm // conjC1 seqInd_conjC_ortho ?eqxx. Qed. Lemma seqInd_nontrivial_irr : (#|[set i | 'chi_i \in S]| > 1)%N. @@ -483,24 +484,28 @@ Definition coherent_with S A tau (tau1 : {additive 'CF(L) -> 'CF(G)}) := Definition coherent S A tau := exists tau1, coherent_with S A tau tau1. + (* This is Peterfalvi, Hypothesis (5.2). *) (* The Z-linearity constraint on tau will be expressed by an additive or *) (* linear structure on tau. *) Definition subcoherent S tau R := [/\ (*a*) [/\ {subset S <= character}, ~~ has cfReal S & cfConjC_closed S], (*b*) {in 'Z[S, L^#], isometry tau, to 'Z[@irr gT G, G^#]}, - (*c*) pairwise_orthogonal S, + (*c*) pairwise_orthogonal [hermitian of @cfdot _ _] S, (*d*) {in S, forall xi : 'CF(L : {set gT}), - [/\ {subset R xi <= 'Z[irr G]}, orthonormal (R xi) + [/\ {subset R xi <= 'Z[irr G]}, + orthonormal [hermitian of @cfdot _ _] (R xi) & tau (xi - xi^*%CF) = \sum_(alpha <- R xi) alpha]} & (*e*) {in S &, forall xi phi : 'CF(L), - orthogonal phi (xi :: xi^*%CF) -> orthogonal (R phi) (R xi)}]. + orthogonal [hermitian of @cfdot _ _] phi (xi :: xi^*%CF) -> + orthogonal [hermitian of @cfdot _ _](R phi) (R xi)}]. Definition dual_iso (nu : {additive 'CF(L) -> 'CF(G)}) := [additive of -%R \o nu \o cfAut conjC]. End Defs. + Section SubsetCoherent. Variables L G : {group gT}. @@ -543,7 +548,7 @@ split=> [|{Inu Znu oSS} phi ZSphi]. have{oSS} ccZS := cfAut_zchar ccS. have vcharS: {subset S <= 'Z[irr L]} by move=> phi /charS/char_vchar. split=> [phi1 phi2 Sphi1 Sphi2 | phi Sphi]. - rewrite cfdotNl cfdotNr opprK Inu ?ccZS // cfdot_conjC aut_Cint //. + rewrite linearNl linearNr opprK /= Inu ?ccZS /= //cfdot_cfAut // aut_Cint //. by rewrite Cint_cfdot_vchar ?(zchar_sub_irr vcharS). by rewrite rpredN Znu ?ccZS. rewrite -{}Dnu //; move: ZSphi; rewrite zcharD1E => /andP[]. @@ -563,7 +568,8 @@ Lemma coherent_seqInd_conjCirr S tau R nu r : subcoherent S tau R -> coherent_with S L^# tau nu -> let chi := 'chi_r in let chi2 := (chi :: chi^*)%CF in chi \in S -> - [/\ {subset map nu chi2 <= 'Z[irr G]}, orthonormal (map nu chi2), + [/\ {subset map nu chi2 <= 'Z[irr G]}, orthonormal [hermitian of @cfdot _ _] + (map nu chi2), chi - chi^*%CF \in 'Z[S, L^#] & (nu chi - nu chi^*)%CF 1%g == 0]. Proof. move=> [[charS nrS ccS] [_ Ztau] oSS _ _] [[Inu Znu] Dnu] chi chi2 Schi. @@ -575,7 +581,7 @@ have Schi_diff: chi - chi^*%CF \in 'Z[S, L^#]. split=> // [_ /mapP[xi /Schi2/Znu ? -> //]||]. apply: map_orthonormal; first by apply: sub_in2 Inu; apply: zchar_trans_on. rewrite orthonormalE (conjC_pair_orthogonal ccS) //=. - by rewrite cfnorm_conjC !cfnorm_irr !eqxx. + by rewrite cfdot_cfAut // !cfnorm_irr ?conjC1 !eqxx. by rewrite -raddfB -cfunD1E Dnu // irr_vchar_on ?Ztau. Qed. @@ -598,7 +604,7 @@ Lemma pivot_coherence S (tau : {additive 'CF(L) -> 'CF(G)}) R eta1 zeta1 : Proof. case=> -[N_S _ _] [Itau Ztau] oSS _ _ Seta1 Zzeta1 isoS Izeta1. have freeS := orthogonal_free oSS; have uniqS := free_uniq freeS. -have{oSS} [/andP[S'0 _] oSS] := pairwise_orthogonalP oSS. +have{oSS} [/andP[S'0 _] oSS] := pairwise_orthogonalP _ _ oSS. pose d := eta1 1%g; pose a (eta : 'CF(L)) := truncC (eta 1%g / d). have{S'0} nzd: d != 0 by rewrite char1_eq0 ?N_S ?(memPn S'0). pose S1 := eta1 :: [seq eta - eta1 *+ a eta | eta <- rem eta1 S]. @@ -616,11 +622,11 @@ have{isoS} isoS: {in behead S1, forall zeta, iso_eta1 zeta}. rewrite /iso_eta1 => _ /mapP[eta Seta ->]; rewrite mem_rem_uniq // in Seta. have{Seta} [/isoS[q [Nq Dq] Itau_eta1] [eta1'eta Seta]] := (Seta, andP Seta). rewrite zcharD1E rpredB ?rpredMn ?mem_zchar //= -scaler_nat /a Dq mulfK //. - by rewrite truncCK // !cfunE Dq subrr cfdotBl cfdotZl -mulNr oSS ?add0r. + by rewrite truncCK // !cfunE Dq subrr linearBl linearZl_LR -mulNr /= oSS ?add0r. have isoS1: {in S1, isometry [eta tau with eta1 |-> zeta1], to 'Z[irr G]}. split=> [xi eta | eta]; rewrite !in_cons /=; last first. by case: eqP => [-> | _ /isoS[/Ztau/zcharW]]. - do 2!case: eqP => [-> _|_ /isoS[? ?]] //; last exact: Itau. + do 2!case: eqP => [-> _ | _ /isoS[? ?]] //; last exact: Itau. by apply/(can_inj (@conjCK _)); rewrite -!cfdotC. have [nu Dnu IZnu] := Zisometry_of_iso freeS1 isoS1. exists nu; split=> // phi; rewrite zcharD1E => /andP[]. @@ -644,19 +650,20 @@ Proof. case=> uniqS irrS ccS nrS [isoL Ztau]. have N_S: {subset S <= character} by move=> _ /irrS/irrP[i ->]; apply: irr_char. have Z_S: {subset S <= 'Z[irr L]} by move=> chi /N_S/char_vchar. -have o1S: orthonormal S by apply: sub_orthonormal (irr_orthonormal L). -have [[_ dotSS] oS] := (orthonormalP o1S, orthonormal_orthogonal o1S). +have o1S: orthonormal [hermitian of @cfdot _ _] S + by apply: sub_orthonormal (irr_orthonormal L). +have [[_ dotSS] oS] := (orthonormalP _ _ o1S, orthonormal_orthogonal o1S). pose beta chi := tau (chi - chi^*%CF); pose eqBP := _ =P beta _. have Zbeta: {in S, forall chi, chi - (chi^*)%CF \in 'Z[S, L^#]}. move=> chi Schi; rewrite /= zcharD1E rpredB ?mem_zchar ?ccS //= !cfunE. by rewrite subr_eq0 conj_Cnat // Cnat_char1 ?N_S. pose sum_beta chi R := \sum_(alpha <- R) alpha == beta chi. -pose Zortho R := all (mem 'Z[irr G]) R && orthonormal R. +pose Zortho R := all (mem 'Z[irr G]) R && orthonormal [dot of @cfdot _ _] R. have R chi: {R : 2.-tuple 'CF(G) | (chi \in S) ==> sum_beta chi R && Zortho R}. apply: sigW; case Schi: (chi \in S) => /=; last by exists [tuple 0; 0]. move/(_ _ Schi) in Zbeta; have /irrP[i def_chi] := irrS _ Schi. have: '[beta chi] = 2%:R. - rewrite isoL // cfnormBd ?dotSS ?ccS ?eqxx // eq_sym -/(cfReal _). + rewrite isoL // hnormBd /= ?dotSS ?ccS ?eqxx // eq_sym -/(cfReal _). by rewrite (negPf (hasPn nrS _ _)). case/zchar_small_norm; rewrite ?(zcharW (Ztau _ _)) // => R [oR ZR sumR]. by exists R; apply/and3P; split; [apply/eqP | apply/allP | ]. @@ -664,18 +671,18 @@ exists (fun xi => val (val (R xi))); split=> // [chi Schi | chi phi Schi Sphi]. by case: (R chi) => Rc /=; rewrite Schi => /and3P[/eqBP-> /allP]. case/andP => /and3P[/=/eqP-opx /eqP-opx' _] _. have{opx opx'} obpx: '[beta phi, beta chi] = 0. - rewrite isoL ?Zbeta // cfdotBl !cfdotBr -{3}[chi]cfConjCK. - by rewrite !cfdot_conjC opx opx' rmorph0 !subr0. + rewrite isoL ?Zbeta // linearBl !linearBr -{3}[chi]cfConjCK. + by rewrite /= !cfdot_cfAut // opx opx' rmorph0 !subr0. case: (R phi) => [[[|a [|b []]] //= _]]. rewrite Sphi => /and3P[/eqBP sum_ab Zab o_ab]. case: (R chi) => [[[|c [|d []]] //= _]]. rewrite Schi => /and3P[/eqBP-sum_cd Zcd o_cd]. -suffices: orthonormal [:: a; - b; c; d]. - rewrite (orthonormal_cat [:: a; _]) => /and3P[_ _]. - by rewrite /orthogonal /= !cfdotNl !oppr_eq0. +suffices: orthonormal [hermitian of @cfdot _ _] [:: a; - b; c; d]. + rewrite (orthonormal_cat _ [:: a; _]) => /and3P[_ _]. + by rewrite /orthogonal /= !linearNl !oppr_eq0. apply: vchar_pairs_orthonormal 1 (-1) _ _ _ _. - by split; apply/allP; rewrite //= rpredN. -- by rewrite o_cd andbT /orthonormal/= cfnormN /orthogonal /= cfdotNr !oppr_eq0. +- by rewrite o_cd andbT /orthonormal/= hnormN /orthogonal /= linearNr !oppr_eq0. - by rewrite oppr_eq0 oner_eq0 rpredN rpred1. rewrite !(big_seq1, big_cons) in sum_ab sum_cd. rewrite scale1r scaleN1r !opprK sum_ab sum_cd obpx eqxx /=. @@ -693,7 +700,7 @@ Lemma prDade_subcoherent (G L K H W W1 W2 : {group gT}) A A0 S cfConjC_subset S (seqIndD K L H 1) -> ~~ has cfReal S -> {R | [/\ subcoherent S tau R, {in [predI S & irr L] & irr W, - forall phi w, orthogonal (R phi) (sigma w)} + forall phi w, orthogonal [dot of @cfdot _ _] (R phi) (sigma w)} & forall j, R (mu j) = Rmu j ]}. Proof. pose mu2 i j := primeTIirr ddA i j. @@ -712,7 +719,7 @@ have Itau: {in 'Z[S, L^#], isometry tau, to 'Z[irr G, G^#]}. apply: sub_iso_to sub_refl (Dade_Zisometry _) => phi; rewrite defSA => SAphi. rewrite defA0; apply: zchar_onS (subsetUl _ _) _ _. by apply: zchar_sub_irr SAphi => ? /sSS0/seqInd_vcharW. -have orthoS: pairwise_orthogonal S. +have orthoS: pairwise_orthogonal [dot of @cfdot _ _]S. exact: sub_pairwise_orthogonal sSS0 uS (seqInd_orthogonal nsKL _). pose S1 := filter (mem (irr L)) S. have sS1S: {subset S1 <= S} by apply/mem_subseq/filter_subseq. @@ -732,19 +739,21 @@ have inS1 phi: [pred j | phi == mu j] =1 pred0 -> phi \in S -> phi \in S1. have Smu_nz j: mu j \in S -> j != 0. move/(hasPn nrS); apply: contraNneq => ->. by rewrite /cfReal -(prTIred_aut ddA) aut_Iirr0. -have oS1sigma phi: phi \in S1 -> orthogonal (R1 phi) (map sigma (irr W)). +have oS1sigma phi: phi \in S1 -> orthogonal [dot of @cfdot _ _] + (R1 phi) (map sigma (irr W)). move=> S1phi; have [zR1 oR1] := R1ok _ S1phi; set psi := _ - _=> Dpsi. - suffices o_psi_sigma: orthogonal (tau psi) (map sigma (irr W)). - apply/orthogonalP=> aa sw R1aa Wsw; have:= orthoPl o_psi_sigma _ Wsw. + suffices o_psi_sigma: orthogonal[dot of @cfdot _ _] (tau psi) (map sigma (irr W)). + apply/orthogonalP=> aa sw R1aa Wsw; have:= orthoPl [dot of @cfdot _ _] + _ _ o_psi_sigma _ Wsw. have{sw Wsw} /dirrP[bw [lw ->]]: sw \in dirr G. have [_ /(cycTIirrP defW)[i [j ->]] ->] := mapP Wsw. exact: cycTIiso_dirr. have [|ba [la Daa]] := vchar_norm1P (zR1 _ R1aa). - by have [_ -> //] := orthonormalP oR1; rewrite eqxx. - rewrite Daa cfdotZl !cfdotZr cfdot_irr. + by have [_ -> //] := orthonormalP [dot of @cfdot _ _] _ oR1; rewrite eqxx. + rewrite Daa linearZl_LR !linearZ /= cfdot_irr. case: eqP => [<-{lw} | _ _]; last by rewrite !mulr0. move/(congr1 ( *%R ((-1) ^+ (ba (+) bw))^*)); rewrite mulr0 => /eqP/idPn[]. - rewrite mulrA -rmorphM -signr_addb {bw}addbK -cfdotZr -{ba la}Daa. + rewrite mulrA -rmorphM -signr_addb {bw}addbK -linearZ /= -{ba la}Daa. rewrite Dpsi -(eq_bigr _ (fun _ _ => scale1r _)). by rewrite cfproj_sum_orthonormal ?oner_eq0. apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i [j ->]] ->]; rewrite -/w_. @@ -763,7 +772,7 @@ have oS1sigma phi: phi \in S1 -> orthogonal (R1 phi) (map sigma (irr W)). have NCpsi_le2: (NC (tau psi) <= 2)%N. have{Itau} [Itau Ztau] := Itau. suff: '[tau psi] <= 2%:R by apply: cycTI_NC_norm; apply: zcharW (Ztau _ _). - rewrite Itau // cfnormBd; first by rewrite cfnorm_conjC Dphi cfnorm_irr. + rewrite Itau // hnormBd /=; first by rewrite cfdot_cfAut // Dphi cfnorm_irr conjC1. have /pairwise_orthogonalP[_ -> //] := orthoS; first exact: ccS. by rewrite eq_sym (hasPn nrS). apply: leq_trans (NCpsi_le2). @@ -777,17 +786,18 @@ have oS1sigma phi: phi \in S1 -> orthogonal (R1 phi) (map sigma (irr W)). exists R; split=> [|phi w S1phi irr_w|j]; first 1 last. - rewrite /R; case: pickP => [j /eqP Dphi | _ /=]. by case/nandP: S1phi; right; rewrite /= Dphi (prTIred_not_irr ddA). - apply/orthoPr=> aa R1aa; rewrite (orthogonalP (oS1sigma phi _)) ?map_f //. + apply/orthoPr=> aa R1aa; rewrite (orthogonalP _ _ _ (oS1sigma phi _)) ?map_f //. by rewrite mem_filter andbC. - by rewrite /R; case: pickP => /= [k /eqP/(prTIred_inj ddA)-> | /(_ j)/eqP]. have Zw i j: w_ i j \in 'Z[irr W] by apply: irr_vchar. -have{oS1sigma} oS1dsw psi j: psi \in S1 -> orthogonal (R1 psi) (dsw _ j). +have{oS1sigma} oS1dsw psi j: psi \in S1 -> orthogonal [dot of @cfdot _ _] + (R1 psi) (dsw _ j). move/oS1sigma/orthogonalP=> opsiW. apply/orthogonalP=> aa _ R1aa /codomP[i ->]. - by rewrite cfdotZr opsiW ?map_f ?mem_irr ?mulr0. -have odsw j1 j2: j1 != j2 -> orthogonal (dsw _ j1) (dsw _ j2). + by rewrite linearZ /= opsiW ?map_f ?mem_irr ?mulr0. +have odsw j1 j2: j1 != j2 -> orthogonal [dot of @cfdot _ _] (dsw _ j1) (dsw _ j2). move/negPf=> j2'1; apply/orthogonalP=> _ _ /codomP[i1 ->] /codomP[i2 ->]. - by rewrite cfdotZl cfdotZr (cfdot_cycTIiso ddA) j2'1 andbF !mulr0. + by rewrite linearZl_LR linearZ /= (cfdot_cycTIiso ddA) j2'1 andbF !mulr0. split=> // [|phi Sphi|phi xi Sphi Sxi]. - by split=> // phi /sSS0; apply: seqInd_char. - rewrite /R; case: pickP => [j /eqP Dphi /= | /inS1/(_ Sphi)/R1ok//]. @@ -800,12 +810,13 @@ split=> // [|phi Sphi|phi xi Sphi Sxi]. - rewrite orthonormal_cat orthogonal_oppr odsw ?andbT; last first. rewrite -(inj_eq (prTIred_inj ddA)) (prTIred_aut ddA) -/mu -Dphi. by rewrite eq_sym (hasPn nrS). - suffices oNdsw k: orthonormal (dsw j k). - by rewrite map_orthonormal ?oNdsw //; apply: in2W; apply: opp_isometry. + suffices oNdsw k: orthonormal [dot of @cfdot _ _] (dsw j k). + rewrite map_orthonormal ?oNdsw //; apply: in2W => x y /=. + by rewrite linearNl linearNr opprK. apply/orthonormalP; split=> [|_ _ /codomP[i1 ->] /codomP[i2 ->]]. rewrite map_inj_uniq ?enum_uniq // => i1 i2 /(can_inj (signrZK _))/eqP. by rewrite (cycTIiso_eqE ddA) eqxx andbT => /eqP. - rewrite cfdotZl cfdotZr rmorph_sign signrMK (cfdot_cycTIiso ddA). + rewrite linearZl_LR linearZ /= rmorph_sign signrMK (cfdot_cycTIiso ddA). by rewrite -(cycTIiso_eqE ddA) (inj_eq (can_inj (signrZK _))). have [Tstruct [tau1 Dtau1 [_ Dtau]]] := uniform_prTIred_coherent ddA nz_j. have{Tstruct} [/orthogonal_free freeT _ ccT _ _] := Tstruct. @@ -841,7 +852,7 @@ Proof. exists [additive of 'Ind[G]]; split=> [|u /zchar_span]; last first. by rewrite span_nil memv0 => /eqP-> /=; rewrite !raddf0. split=> [u v | u] /zchar_span; rewrite span_nil memv0 => /eqP->. - by rewrite raddf0 !cfdot0l. + by rewrite raddf0 !linear0l. by rewrite raddf0 rpred0. Qed. @@ -856,7 +867,8 @@ exact: sub_pairwise_orthogonal oS. Qed. Lemma subset_ortho_subcoherent S1 chi : - {subset S1 <= S} -> chi \in S -> chi \notin S1 -> orthogonal S1 chi. + {subset S1 <= S} -> chi \in S -> chi \notin S1 -> orthogonal + [hermitian of @cfdot _ _] S1 chi. Proof. move=> sS1S Schi S1'chi; apply/orthoPr=> phi S1phi; have Sphi := sS1S _ S1phi. have [_ _ /pairwise_orthogonalP[_ -> //]] := cohS. @@ -866,15 +878,17 @@ Qed. Lemma subcoherent_split chi beta : chi \in S -> beta \in 'Z[irr G] -> exists2 X, X \in 'Z[R chi] - & exists Y, [/\ beta = X - Y, '[X, Y] = 0 & orthogonal Y (R chi)]. + & exists Y, [/\ beta = X - Y, '[X, Y] = 0 & orthogonal + [hermitian of @cfdot _ _] Y (R chi)]. Proof. move=> Schi Zbeta; have [_ _ _ /(_ _ Schi)[ZR oRR _] _] := cohS. -have [X RX [Y [defXY oXY oYR]]] := orthogonal_split (R chi) beta. +have [X RX [Y [defXY oXY oYR]]] := + orthogonal_split [dot of @cfdot _ _] (R chi) beta. exists X; last first. - by exists (- Y); rewrite opprK (orthogonal_oppl Y) cfdotNr oXY oppr0. + by exists (- Y); rewrite opprK (orthogonal_oppl _ Y) linearNr /= oXY oppr0. have [_ -> ->] := orthonormal_span oRR RX; rewrite big_seq rpred_sum // => a Ra. rewrite rpredZ_Cint ?mem_zchar // -(addrK Y X) -defXY. -by rewrite cfdotBl (orthoPl oYR) // subr0 Cint_cfdot_vchar // ZR. +by rewrite linearBl /= (orthoPl _ _ _ oYR) // subr0 Cint_cfdot_vchar // ZR. Qed. (* This is Peterfalvi (5.4). *) @@ -882,11 +896,13 @@ Qed. (* stronger form of the lemma is needed to strengthen the proof of (5.6.3) so *) (* that it can actually be reused in (9.11.8), as the text suggests. *) Lemma subcoherent_norm chi psi (tau1 : {additive 'CF(L) -> 'CF(G)}) X Y : - [/\ chi \in S, psi \in 'Z[irr L] & orthogonal (chi :: chi^*)%CF psi] -> + [/\ chi \in S, psi \in 'Z[irr L] & + orthogonal [hermitian of @cfdot _ _] (chi :: chi^*)%CF psi] -> let S0 := chi - psi :: chi - chi^*%CF in {in 'Z[S0], isometry tau1, to 'Z[irr G]} -> tau1 (chi - chi^*%CF) = tau (chi - chi^*%CF) -> - [/\ tau1 (chi - psi) = X - Y, '[X, Y] = 0 & orthogonal Y (R chi)] -> + [/\ tau1 (chi - psi) = X - Y, '[X, Y] = 0 & + orthogonal [hermitian of @cfdot _ _] Y (R chi)] -> [/\ (*a*) '[chi] <= '[X] & (*b*) '[psi] <= '[Y] -> [/\ '[X] = '[chi], '[Y] = '[psi] @@ -895,25 +911,25 @@ Proof. case=> Schi Zpsi /and3P[/andP[/eqP-ochi_psi _] /andP[/eqP-ochic_psi _] _] S0. move=> [Itau1 Ztau1] tau1dchi [defXY oXY oYR]. have [[ZS nrS ccS] [tS Zt] oS /(_ _ Schi)[ZR o1R tau_dchi] _] := cohS. -have [/=/andP[S'0 uS] oSS] := pairwise_orthogonalP oS. +have [/=/andP[S'0 uS] oSS] := pairwise_orthogonalP [dot of @cfdot _ _] _ oS. have [nRchi Schic] := (hasPn nrS _ Schi, ccS _ Schi). have ZtauS00: tau1 S0`_0 \in 'Z[irr G] by rewrite Ztau1 ?mem_zchar ?mem_head. have{ZtauS00} [X1 R_X1 [Y1 [dXY1 oXY1 oY1R]]] := subcoherent_split Schi ZtauS00. -have [uR _] := orthonormalP o1R; have [a Za defX1] := zchar_expansion uR R_X1. +have [uR _] := orthonormalP [dot of @cfdot _ _] _ o1R; have [a Za defX1] := zchar_expansion uR R_X1. have dotS00R xi: xi \in R chi -> '[tau1 S0`_0, xi] = a xi. - move=> Rxi; rewrite dXY1 cfdotBl (orthoPl oY1R) // subr0. + move=> Rxi; rewrite dXY1 cfdotBl (orthoPl _ _ _ oY1R) // subr0. by rewrite defX1 cfproj_sum_orthonormal. have nchi: '[chi] = \sum_(xi <- R chi) a xi. transitivity '[tau1 S0`_0, tau1 S0`_1]; last first. - by rewrite tau1dchi tau_dchi cfdot_sumr; apply: eq_big_seq dotS00R. - rewrite [RHS]cfdotC Itau1 ?mem_zchar ?mem_nth // cfdotBl !cfdotBr. + by rewrite tau1dchi tau_dchi linear_sumr; apply: eq_big_seq dotS00R. + rewrite [RHS]cfdotC Itau1 ?mem_zchar ?mem_nth // linearBl !linearBr /=. by rewrite ochi_psi ochic_psi (oSS chi^*%CF) // !subr0 -cfdotC. have normX: '[X1] <= '[X] ?= iff (X == X1). - rewrite -[in '[X]](subrK X1 X) -subr_eq0 cfnormDd. + rewrite -[in '[X]](subrK X1 X) -subr_eq0 hnormDd /=. by rewrite -lerif_subLR subrr -cfnorm_eq0 eq_sym; apply/lerif_eq/cfnorm_ge0. - rewrite defX1 cfdot_sumr big1_seq // => xi Rxi. - rewrite cfdotZr cfdotBl cfproj_sum_orthonormal // -{2}dotS00R // defXY. - by rewrite cfdotBl (orthoPl oYR) // subr0 subrr mulr0. + rewrite defX1 linear_sumr big1_seq // => xi Rxi. + rewrite linearZ /= linearBl /= cfproj_sum_orthonormal // -{2}dotS00R // defXY. + by rewrite cfdotBl (orthoPl _ _ _ oYR) // subr0 subrr mulr0. pose is01a xi := a xi == (a xi != 0)%:R. have leXa xi: a xi <= `|a xi| ^+ 2 ?= iff is01a xi. rewrite Cint_normK //; split; first by rewrite Cint_ler_sqr. @@ -923,7 +939,7 @@ have{nchi normX} part_a: '[chi] <= '[X] ?= iff all is01a (R chi) && (X == X1). apply: lerif_trans normX; rewrite nchi defX1 cfnorm_sum_orthonormal //. by rewrite -big_all !(big_tnth _ _ (R chi)) big_andE; apply: lerif_sum. split=> [|/lerif_eq part_b]; first by case: part_a. -have [_ /esym] := lerif_add part_a part_b; rewrite -!cfnormBd // -defXY. +have [_ /esym] := lerif_add part_a part_b; rewrite -!hnormBd //= -defXY. rewrite Itau1 ?mem_zchar ?mem_head // eqxx => /andP[a_eq /eqP->]. split=> //; first by apply/esym/eqP; rewrite part_a. have{a_eq} [/allP a01 /eqP->] := andP a_eq; rewrite defX1. @@ -942,7 +958,7 @@ Proof. set S1 := chi :: _ => Schi [iso_t1 Zt1] t1cc'. have freeS1: free S1. have [[_ nrS ccS] _ oS _ _] := cohS. - by rewrite orthogonal_free ?(conjC_pair_orthogonal ccS). + by rewrite (@orthogonal_free _ _ [dot of @cfdot _ _]) ?(conjC_pair_orthogonal ccS). have subS01: {subset 'Z[chi - 0 :: chi - chi^*%CF] <= 'Z[S1]}. apply: zchar_trans setT _; apply/allP; rewrite subr0 /= andbT. by rewrite rpredB !mem_zchar ?inE ?eqxx ?orbT. @@ -952,7 +968,7 @@ have [X R_X [Y defXY]] := subcoherent_split Schi Zt1c. case/subcoherent_norm: (defXY); last 2 [by []]. - by rewrite Schi rpred0 /orthogonal /= !cfdot0r eqxx. - by split; [apply: sub_in2 iso_t1 | apply: sub_in1 Zt1]. -move=> _ [|_ /eqP]; rewrite cfdot0l ?cfnorm_ge0 // cfnorm_eq0 => /eqP Y0. +move=> _ [|_ /eqP]; rewrite linear0l ?cfnorm_ge0 // cfnorm_eq0 => /eqP Y0. case=> E sER defX; exists E => //; rewrite -defX -[X]subr0 -Y0 -[chi]subr0. by case: defXY. Qed. @@ -974,15 +990,15 @@ Qed. Corollary coherent_ortho_supp S1 chi (tau1 : {additive 'CF(L) -> 'CF(G)}) : cfConjC_subset S1 S -> coherent_with S1 L^# tau tau1 -> chi \in S -> chi \notin S1 -> - orthogonal (map tau1 S1) (R chi). + orthogonal [hermitian of @cfdot _ _] (map tau1 S1) (R chi). Proof. move=> uccS1 cohS1 Schi S1'chi; have [uS1 sS1S ccS1] := uccS1. apply/orthogonalP=> _ mu /mapP[phi S1phi ->] Rmu; have Sphi := sS1S _ S1phi. have [e /mem_subseq Re ->] := mem_coherent_sum_subseq uccS1 cohS1 S1phi. -rewrite cfdot_suml big1_seq // => xi {e Re}/Re Rxi. -apply: orthogonalP xi mu Rxi Rmu; have [_ _ _ _ -> //] := cohS. +rewrite linear_suml big1_seq // => xi {e Re}/Re Rxi /=. +apply:( orthogonalP _) xi mu Rxi Rmu; have [_ _ _ _ -> //] := cohS. rewrite /orthogonal /= !andbT cfdot_conjCr fmorph_eq0. -by rewrite !(orthoPr (subset_ortho_subcoherent sS1S _ _)) ?ccS1 ?eqxx. +by rewrite !(orthoPr _ _ _ (subset_ortho_subcoherent sS1S _ _ )) ?ccS1 ?eqxx. Qed. (* An even more frequently used corollary of the corollary above. *) @@ -990,12 +1006,15 @@ Corollary coherent_ortho S1 S2 (tau1 tau2 : {additive 'CF(L) -> 'CF(G)}) : cfConjC_subset S1 S -> coherent_with S1 L^# tau tau1 -> cfConjC_subset S2 S -> coherent_with S2 L^# tau tau2 -> {subset S2 <= [predC S1]} -> - orthogonal (map tau1 S1) (map tau2 S2). + orthogonal [hermitian of @cfdot _ _] (map tau1 S1) (map tau2 S2). Proof. move=> uccS1 cohS1 uccS2 cohS2 S1'2; have [_ sS2S _] := uccS2. apply/orthogonalP=> mu _ S1mu /mapP[phi S2phi ->]. have [e /mem_subseq Re ->] := mem_coherent_sum_subseq uccS2 cohS2 S2phi. -rewrite cfdot_sumr big1_seq // => xi {e Re}/Re; apply: orthogonalP mu xi S1mu. +rewrite linear_sumr /= big1_seq // => xi {e Re}/Re hxi. +(*LR burk...*) +suff: (orthogonal [hermitian of @cfdot _ _] [seq tau1 i | i <- S1] (R phi)). + by move/(orthogonalP _) /(_ mu xi S1mu hxi). by apply: coherent_ortho_supp; rewrite ?sS2S //; apply: S1'2. Qed. @@ -1016,12 +1035,13 @@ have [[N_S1 _ _] _ oS11 _ _] := subset_subcoherent uccS1. have [_ _ oS22 _ _] := subset_subcoherent uccS2. have nz_chi1: chi 1%g != 0; last move/mem_zchar in S1chi. by rewrite char1_eq0 ?N_S1 //; have [/memPn->] := andP oS11. -have oS12: orthogonal S1 S2. +have oS12: orthogonal [hermitian of @cfdot _ _ ] S1 S2. apply/orthogonalP=> xi1 xi2 Sxi1 Sxi2; apply: orthoPr xi1 Sxi1. by rewrite subset_ortho_subcoherent ?sS2S //; apply: S1'2. set S3 := S1 ++ S2; pose Y := map tau1 S1 ++ map tau2 S2. -have oS3: pairwise_orthogonal S3 by rewrite pairwise_orthogonal_cat oS11 oS22. -have oY: pairwise_orthogonal Y. +have oS3: pairwise_orthogonal [hermitian of @cfdot _ _] S3 + by rewrite pairwise_orthogonal_cat oS11 oS22. +have oY: pairwise_orthogonal [hermitian of @cfdot _ _] Y. by rewrite pairwise_orthogonal_cat !map_pairwise_orthogonal ?coherent_ortho. have Z_Y: {subset Y <= 'Z[irr G]}. move=> psi; rewrite mem_cat. @@ -1071,20 +1091,20 @@ have [[N_S nrS ccS] ZItau _ R_P _] := cohS; have [Itau Ztau] := ZItau. have [Sphi [ZR o1R sumR]] := (sS1S _ S1phi, R_P _ Schi). have Zbeta: beta \in 'Z[S, L^#]. by rewrite zcharD1E !cfunE -chi1 subrr rpredB ?scale_zchar ?mem_zchar /=. -have o_aphi_R: orthogonal (a *: tau1 phi) (R chi). +have o_aphi_R: orthogonal [hermitian of @cfdot _ _] (a *: tau1 phi) (R chi). have /orthogonalP oS1R := coherent_ortho_supp sS10 cohS1 Schi S1'chi. - by apply/orthoPl=> xi Rxi; rewrite cfdotZl oS1R ?map_f ?mulr0. -have /orthoPl o_chi_S1: orthogonal chi S1. + by apply/orthoPl=> xi Rxi; rewrite linearZl_LR /= oS1R ?map_f ?mulr0. +have /orthoPl o_chi_S1: orthogonal [hermitian of @cfdot _ _] chi S1. by rewrite orthogonal_sym subset_ortho_subcoherent. have Zdchi: chi - chi^*%CF \in 'Z[S, L^#]. by rewrite sub_aut_zchar ?zchar_onG ?mem_zchar ?ccS // => xi /N_S/char_vchar. have [||_] := subcoherent_norm _ _ (erefl _) (And3 tau_beta oXaphi o_aphi_R). -- rewrite Schi rpredZ_Cint ?char_vchar ?N_S /orthogonal //= !cfdotZr. +- rewrite Schi rpredZ_Cint ?char_vchar ?N_S /orthogonal //= !linearZ /=. by rewrite cfdot_conjCl !o_chi_S1 ?ccS1 // conjC0 !mulr0 !eqxx. - apply: sub_iso_to ZItau; [apply: zchar_trans_on; apply/allP | exact: zcharW]. by rewrite /= Zbeta Zdchi. -case=> [|nX _ [e Re defX]]; first by rewrite !cfnormZ Itau1 ?mem_zchar. -have uR: uniq (R chi) by have [] := orthonormalP o1R. +case=> [|nX _ [e Re defX]]; first by rewrite !dnormZ Itau1 ?mem_zchar. +have uR: uniq (R chi) by have [] := orthonormalP _ _ o1R. have{uR} De: e = filter (mem e) (R chi) by apply/subseq_uniqP. pose ec := filter [predC e] (R chi); pose Xc := - \sum_(xi <- ec) xi. have defR: perm_eq (e ++ ec) (R chi) by rewrite De perm_filterC. @@ -1092,18 +1112,18 @@ pose S2 := chi :: chi^*%CF; pose X2 := X :: Xc. have{nrS} uS2: uniq S2 by rewrite /= andbT inE eq_sym (hasPn nrS). have sS20: cfConjC_subset S2 S. by split=> //; apply/allP; rewrite /= ?cfConjCK ?inE ?eqxx ?orbT // ccS Schi. -have oS2: pairwise_orthogonal S2 by have [] := subset_subcoherent sS20. +have oS2: pairwise_orthogonal [hermitian of @cfdot _ _] S2 by have [] := subset_subcoherent sS20. have nz_chi: chi != 0 by rewrite eq_sym; have [/norP[]] := andP oS2. have o_chi_chic: '[chi, chi^*] = 0 by have [_ /andP[/andP[/eqP]]] := and3P oS2. have def_XXc: X - Xc = tau (chi - chi^*%CF). by rewrite opprK defX -big_cat sumR; apply: eq_big_perm. have oXXc: '[X, Xc] = 0. - have /span_orthogonal o_e_ec: orthogonal e ec. - by move: o1R; rewrite -(eq_orthonormal defR) orthonormal_cat => /and3P[]. + have /span_orthogonal o_e_ec: orthogonal [hermitian of @cfdot _ _] e ec. + by move: o1R; rewrite -(eq_orthonormal _ defR) orthonormal_cat => /and3P[]. by rewrite defX /Xc !big_seq o_e_ec ?rpredN ?rpred_sum // => xi /memv_span. have{o_chi_chic} nXc: '[Xc] = '[chi^*]. - by apply: (addrI '[X]); rewrite -cfnormBd // nX def_XXc Itau // cfnormBd. -have{oXXc} oX2: pairwise_orthogonal X2. + by apply: (addrI '[X]); rewrite -hnormBd // nX def_XXc Itau // hnormBd. +have{oXXc} oX2: pairwise_orthogonal [hermitian of @cfdot _ _] X2. rewrite /pairwise_orthogonal /= oXXc eqxx !inE !(eq_sym 0) -!cfnorm_eq0. by rewrite nX nXc cfnorm_conjC cfnorm_eq0 orbb nz_chi. have{nX nXc} nX2: map cfnorm X2 = map cfnorm S2 by congr [:: _; _]. @@ -1138,7 +1158,7 @@ have [Sxi1 [ZRchi o1Rchi sumRchi]] := (sS1S _ S1xi1, R_P _ Schi). have ocS1 xi: xi \in S1 -> '[chi, xi] = 0. by apply: orthoPl; rewrite orthogonal_sym subset_ortho_subcoherent. have /andP[/memPn/=nzS _] := oS; have [Nchi nz_chi] := (N_S _ Schi, nzS _ Schi). -have oS1: pairwise_orthogonal S1 by apply: sub_pairwise_orthogonal oS. +have oS1: pairwise_orthogonal [hermitian of @cfdot _ _] S1 by apply: sub_pairwise_orthogonal _ oS. have [freeS freeS1] := (orthogonal_free oS, orthogonal_free oS1). have nz_nS1 xi: xi \in S1 -> '[xi] != 0 by rewrite cfnorm_eq0 => /sS1S/nzS. have nz_xi11: xi1 1%g != 0 by rewrite char1_eq0 ?N_S ?nzS. @@ -1156,13 +1176,13 @@ have [X R_X [Y defXY]] := subcoherent_split Schi Ztau_achi. have [eqXY oXY oYRchi] := defXY; pose X1 := map tau1 (in_tuple S1). suffices defY: Y = a *: tau1 xi1. by move: eqXY; rewrite defY; apply: extend_coherent_with; rewrite -?defY. -have oX1: pairwise_orthogonal X1 by apply: map_pairwise_orthogonal. +have oX1: pairwise_orthogonal [hermitian of @cfdot _ _ ]X1 by apply: map_pairwise_orthogonal. have N_S1_1 xi: xi \in S1 -> xi 1%g \in Cnat by move/sS1S/N_S/Cnat_char1. -have oRchiX1 psi: psi \in 'Z[R chi] -> orthogonal psi X1. +have oRchiX1 psi: psi \in 'Z[R chi] -> orthogonal [hermitian of @cfdot _ _ ] psi X1. move/zchar_span=> Rpsi; apply/orthoPl=> chi2 /memv_span. by apply: span_orthogonal Rpsi; rewrite orthogonal_sym coherent_ortho_supp. have [lam Zlam [Z oZS1 defY]]: - exists2 lam, lam \in Cint & exists2 Z : 'CF(G), orthogonal Z (map tau1 S1) & + exists2 lam, lam \in Cint & exists2 Z : 'CF(G), orthogonal [hermitian of @cfdot _ _ ] Z (map tau1 S1) & Y = a *: tau1 xi1 - lam *: (\sum_(xi <- X1) a_ xi *: xi) + Z. - pose lam := a * '[xi1] - '[Y, tau1 xi1]; exists lam. rewrite rpredD ?mulr_natl ?rpredN //. @@ -1172,46 +1192,48 @@ have [lam Zlam [Z oZS1 defY]]: set Z' := _ - _; exists (Y - Z'); last by rewrite addrC subrK. have oXtau1 xi: xi \in S1 -> '[Y, tau1 xi] = - '[X - Y, tau1 xi]. move=> S1xi; rewrite cfdotBl opprB. - by rewrite (orthogonalP (oRchiX1 X R_X) X) ?subr0 ?mem_head ?map_f. + by rewrite (orthogonalP [hermitian of @cfdot _ _ ] _ _ (oRchiX1 X R_X) X) ?subr0 ?mem_head ?map_f. apply/orthogonalP=> _ _ /predU1P[-> | //] /mapP[xi S1xi ->]. - rewrite !cfdotBl !cfdotZl Itau1 ?mem_zchar //. - rewrite cfproj_sum_orthogonal ?map_f // a_E // Itau1 ?Z_S1 //. - apply: (mulIf nz_xi11); rewrite divfK ?nz_nS1 // 2!mulrBl mulrA divfK //. + rewrite !linearBl 2!linearZl_LR /= Itau1 ?mem_zchar //=. + rewrite cfproj_sum_orthogonal ?map_f // a_E // Itau1 ?Z_S1 //=. + apply: (mulIf nz_xi11); rewrite divfK ?nz_nS1 // 2!mulrBl (mulrA lam) divfK //. rewrite mul0r mulrBl opprB -addrA addrCA addrC !addrA !oXtau1 // !mulNr. rewrite -(conj_Cnat (N_S1_1 _ S1xi)) -(conj_Cnat (N_S1_1 _ S1xi1)). - rewrite opprK [- _ + _]addrC -!(mulrC _^*) -!cfdotZr -cfdotBr. + rewrite opprK [- _ + _]addrC -!(mulrC _^*) -!linearZ -linearBr /=. rewrite -!raddfZ_Cnat ?N_S1_1 // -raddfB; set beta : 'CF(L) := _ - _. have Zbeta: beta \in 'Z[S1, L^#]. rewrite zcharD1E !cfunE mulrC subrr eqxx. by rewrite rpredB ?rpredZ_Cint ?Z_S1 // CintE N_S1_1. - rewrite -eqXY Dtau1 // Itau // ?(zchar_subset sS1S) //. - rewrite cfdotBl !cfdotBr !cfdotZr !ocS1 // !mulr0 subrr add0r !cfdotZl. + rewrite -eqXY Dtau1 // Itau // ?(zchar_subset sS1S) //=. + rewrite linearBl !linearBr !linearZ /= !ocS1 // !mulr0 subrr add0r !linearZl_LR /=. by rewrite opprB addrAC subrK subrr. have [||leXchi _] := subcoherent_norm _ _ (erefl _) defXY. -- rewrite Schi scale_zchar ?char_vchar ?N_S /orthogonal //= !cfdotZr ocS1 //. +- rewrite Schi scale_zchar ?char_vchar ?N_S /orthogonal //= !linearZ /= ocS1 //. by rewrite -[xi1]cfConjCK cfdot_conjC ocS1 ?ccS1 // conjC0 mulr0 eqxx. - apply: sub_iso_to ZItau; [apply: zchar_trans_on; apply/allP | exact: zcharW]. rewrite /= Zachi sub_aut_zchar ?zchar_onG ?mem_zchar ?ccS //. by move=> xi /N_S/char_vchar. have normXY: '[X] + '[Y] = '[chi] + '[a *: xi1]. - by rewrite -!cfnormBd // ?cfdotZr ?ocS1 ?mulr0 // -eqXY Itau. + by rewrite -!hnormBd // !linearZ /= ?ocS1 ?mulr0 // -eqXY Itau ?scalerN. have{leXchi normXY}: '[Y] <= a ^+ 2 * '[xi1]. - by rewrite -(ler_add2l '[X]) normXY cfnormZ Cint_normK // ler_add2r. -rewrite {}defY cfnormDd; last first. - rewrite cfdotC (span_orthogonal oZS1) ?rmorph0 ?memv_span1 //. + by rewrite -(ler_add2l '[X]) normXY dnormZ Cint_normK // ler_add2r. +rewrite {}defY hnormDd /= ; last first. + rewrite /= cfdotC (span_orthogonal oZS1) ?rmorph0 ?memv_span1 //. rewrite big_seq memvB ?memvZ ?memv_suml ?memv_span ?map_f //. by move=> theta S1theta; rewrite memvZ ?memv_span. -rewrite -cfnormN opprB cfnormB !cfnormZ !Cint_normK // addrAC ler_subl_addl. -rewrite cfdotZl cfdotZr cfnorm_sum_orthogonal ?cfproj_sum_orthogonal ?map_f //. +rewrite -hnormN /= opprB hnormB /= !dnormZ /= !Cint_normK // addrAC ler_subl_addl. +rewrite /= linearZ /= linearZl_LR /= cfnorm_sum_orthogonal ?cfproj_sum_orthogonal ?map_f //. rewrite a_xi1 Itau1 ?Z_S1 // addrAC ler_add2r !(divfK, mulrA) ?nz_nS1 //. rewrite !conj_Cint ?rpredM // => /ler_gtF-lb_2_lam_a. suffices lam0: lam = 0; last apply: contraFeq lb_2_lam_a => nz_lam. suffices ->: Z = 0 by rewrite lam0 scale0r subrK. - by apply: contraFeq lb_2_lam_a; rewrite -cfnorm_gt0 lam0 expr0n !mul0r !add0r. -rewrite ltr_paddr ?cfnorm_ge0 // -mulr2n -mulr_natl mulrCA. + by apply: contraFeq lb_2_lam_a; rewrite -cfnorm_gt0 lam0 expr0n !mul0r !mulr0 !add0r. +rewrite ltr_paddr ?cfnorm_ge0 // expr0 mul1r -mulr2n -mulr_natl mulrCA. have xi11_gt0: xi1 1%g > 0 by rewrite char1_gt0 ?N_S ?sS1S -?cfnorm_eq0 ?nz_nS1. have a_gt0: a > 0 by rewrite -(ltr_pmul2r xi11_gt0) mul0r -chi1 char1_gt0. apply: ler_lt_trans (_ : lam ^+ 2 * (2%:R * a) < _). + have ->: a * (2%:R * lam) = lam * (2%:R * a). + by rewrite mulrC (mulrC _ lam) mulrA. by rewrite ler_pmul2r ?mulr_gt0 ?ltr0n ?Cint_ler_sqr. rewrite ltr_pmul2l ?(ltr_le_trans ltr01) ?sqr_Cint_ge1 {lam Zlam nz_lam}//. rewrite -(ltr_pmul2r xi11_gt0) -mulrA -chi1 -(ltr_pmul2r xi11_gt0). @@ -1244,9 +1266,9 @@ have Zd: {in S &, forall xi1 xi2, xi1 - xi2 \in 'Z[S, L^#]}. by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE !unifS ?subrr. pose chi2 := chi1^*%CF; have Schi2: chi2 \in S by rewrite ccS. have ch1'2: chi2 != chi1 by apply/(hasPn nrS). -have [_ oSS] := pairwise_orthogonalP oS. +have [_ oSS] := pairwise_orthogonalP [dot of @cfdot _ _] _ oS. pose S1 xi := [predD1 S & xi]; pose S2 xi := [predD1 (S1 xi) & xi^*%CF]. -have{oR} oR xi1 xi2: xi1 \in S -> xi2 \in S2 xi1 -> orthogonal (R xi1) (R xi2). +have{oR} oR xi1 xi2: xi1 \in S -> xi2 \in S2 xi1 -> orthogonal [hermitian of @cfdot _ _] (R xi1) (R xi2). move=> Sxi1 /and3P[/= xi1J'2 xi1'2 Sxi2]. by rewrite orthogonal_sym oR // /orthogonal /= !oSS ?eqxx // ccS. have oSc xi: xi \in S -> '[xi, xi^*] = 0. @@ -1256,7 +1278,7 @@ have Z_D xi: xi \in S -> D xi \in 'Z[irr G] by move/(Zd _ _ Schi1)/Ztau/zcharW. have /CnatP[N defN]: '[chi1] \in Cnat by rewrite Cnat_cfdot_char ?N_S. have dotD: {in S1 chi1 &, forall xi1 xi2, '[D xi1, D xi2] = N%:R + '[xi1, xi2]}. move=> xi1 xi2 /andP[ch1'xi1 Sxi1] /andP[chi1'xi2 Sxi2]. - rewrite Itau ?Zd // cfdotBl !cfdotBr defN. + rewrite Itau ?Zd // linearBl !linearBr /= defN. by rewrite 2?oSS // 1?eq_sym // opprB !subr0. have /R_P[ZRchi oRchi defRchi] := Schi1. have szRchi: size (R chi1) = (N + N)%N. @@ -1275,10 +1297,11 @@ have haveX xi: xi \in S2 chi1 -> exists2 X, Xspec X & Xi_spec X xi. have [X1 RxiX1 [Y defX1Y]] := subcoherent_split Sxi Z_Y1. have [[eqX1Y oX1Y oYxi] sRxiX1] := (defX1Y, zchar_span RxiX1). pose Y2 : 'CF(G) := X + Y; pose D2 : 'CF(G) := tau (xi - chi1). - have oY2Rxi: orthogonal Y2 (R xi). - apply/orthoPl=> phi Rxi_phi; rewrite cfdotDl (orthoPl oYxi) // addr0. + have oY2Rxi: orthogonal [hermitian of @cfdot _ _] Y2 (R xi). + apply/orthoPl=> phi Rxi_phi; rewrite linearDl /= (orthoPl _ _ _ oYxi) // addr0. by rewrite (span_orthogonal (oR chi1 xi _ _)) // memv_span. - have{oY2Rxi} defX1Y2: [/\ D2 = X1 - Y2, '[X1, Y2] = 0 & orthogonal Y2 (R xi)]. + have{oY2Rxi} defX1Y2: [/\ D2 = X1 - Y2, '[X1, Y2] = 0 & + orthogonal [hermitian of @cfdot _ _] Y2 (R xi)]. rewrite -opprB -addrA -opprB -eqX1Y -eqXY1 -linearN opprB cfdotC. by rewrite (span_orthogonal oY2Rxi) ?conjC0 ?memv_span1 ?(zchar_span RxiX1). have [||minX eqX1] := subcoherent_norm _ _ (erefl _) defXY1. @@ -1290,7 +1313,7 @@ have haveX xi: xi \in S2 chi1 -> exists2 X, Xspec X & Xi_spec X xi. exact: cfConjCK. - apply: sub_iso_to IZtau; last exact: zcharW. by apply: zchar_trans_on; apply/allP; rewrite /= !Zd. - rewrite eqX1Y cfnormBd // defN in eqX1. + rewrite eqX1Y hnormBd // defN in eqX1. have{eqX1} [|nX n_xi defX] := eqX1; first by rewrite ler_paddr ?cfnorm_ge0. exists X => //; split; last by rewrite eqXY1 cfdotBr oXY1 subr0. suffices Y0: Y = 0 by rewrite eqXY1 eqX1Y Y0 subr0 opprB addrC subrK. @@ -1313,32 +1336,34 @@ have [X [RchiX nX defX] XD_N]: exists2 X, Xspec X & XDspec X. have /R_P[_ _ defRxi1] := Sxi1; have [-> // | xi1'xi] := eqVneq xi xi1. have [sRchiX sRxi1X1] := (zchar_span RchiX, zchar_span Rxi1X1). have [-> | xi2'xi] := eqVneq xi xi2. - rewrite /D -[chi1](subrK xi1) -addrA linearD cfdotDr XD_N defRxi1 big_seq. + rewrite /D -[chi1](subrK xi1) -addrA linearD linearDr /= XD_N defRxi1 big_seq. rewrite (span_orthogonal (oR chi1 xi1 _ _)) ?addr0 ?rpred_sum //. exact/memv_span. have /haveX[X' [RchiX' nX' _] [Rxi3X' X'D_N]] := S2xi. have [sRchiX' sRxi1X'] := (zchar_span RchiX', zchar_span Rxi3X'). suffices: '[X - X'] == 0 by rewrite cfnorm_eq0 subr_eq0 => /eqP->. have ZXX': '[X, X'] \in Cint by rewrite Cint_cfdot_vchar ?(zchar_trans ZRchi). - rewrite cfnormB subr_eq0 nX nX' aut_Cint {ZXX'}//; apply/eqP/esym. - congr (_ *+ 2); rewrite -(addNKr (X - D xi1) X) cfdotDl cfdotC. + rewrite hnormB subr_eq0 /= nX nX' aut_Cint {ZXX'}// expr0 mul1r; apply/eqP/esym. + congr (_ *+ 2); rewrite -(addNKr (X - D xi1) X) linearDl /= cfdotC. rewrite (span_orthogonal (oR chi1 xi1 _ _)) // conjC0. - rewrite -(subrK (D xi) X') cfdotDr cfdotDl cfdotNl opprB subrK. + rewrite -(subrK (D xi) X') linearDr linearDl linearNl opprB subrK /=. rewrite (span_orthogonal (oR xi1 xi _ _)) //; last exact/and3P. rewrite (span_orthogonal (oR chi1 xi _ _)) // oppr0 !add0r. by rewrite dotD ?oSS ?addr0 1?eq_sym //; apply/andP. have{RchiX} ZX: X \in 'Z[irr G] := zchar_trans ZRchi RchiX. apply: (pivot_coherence cohS Schi1 ZX); rewrite defN //. move=> xi /andP[chi1'xi Sxi]; exists 1; first by rewrite rpred1 mul1r unifS. -rewrite scale1r mulN1r -conjC_nat -opprB raddfN cfdotNl cfdotC; congr (- _^*). +rewrite scale1r mulN1r -conjC_nat -opprB raddfN linearNl /= cfdotC; congr (- _^*). have [-> /= | chi2'xi] := eqVneq xi chi2; last exact/XD_N/and3P. have{defX}[E ssER defX] := defX; pose Ec := filter [predC E] (R chi1). have eqRchi: perm_eq (R chi1) (E ++ Ec). rewrite -(perm_filterC (mem E)) -(subseq_uniqP _ _) //. - exact/free_uniq/orthonormal_free. -have /and3P[oE _ oEEc]: [&& orthonormal E, orthonormal Ec & orthogonal E Ec]. - by rewrite (eq_orthonormal eqRchi) orthonormal_cat in oRchi. -rewrite defRchi (eq_big_perm _ eqRchi) big_cat -defX cfdotDr nX defX !big_seq. + by apply/free_uniq; apply:(orthonormal_free oRchi). +have /and3P[oE _ oEEc]: [&& orthonormal [hermitian of @cfdot _ _] E, + orthonormal [hermitian of @cfdot _ _] Ec & + orthogonal [hermitian of @cfdot _ _] E Ec]. + by rewrite (eq_orthonormal _ eqRchi) orthonormal_cat in oRchi. +rewrite defRchi (eq_big_perm _ eqRchi) big_cat -defX linearDr /= nX defX !big_seq. by rewrite (span_orthogonal oEEc) ?addr0 ?rpred_sum //; apply: memv_span. Qed. @@ -1395,12 +1420,12 @@ have [nzk nzj]: k != 0 /\ j != 0 by rewrite !nzSmu // /mu (prTIred_aut ddA) ccS. have sSS: cfConjC_subset S S by have:= free_uniq freeS; split. have{sSS} Dtau1S:= mem_coherent_sum_subseq subcohS sSS cohS. have o_sum_eta a j1 i j2: j1 != j2 -> '[sum_eta a j1, eta_ i j2] = 0. - move/negPf=> neq_j; rewrite cfdot_suml big1 // => i1 _. - by rewrite cfdotZl cfdot_cycTIiso neq_j andbF mulr0. + move/negPf=> neq_j; rewrite linear_suml big1 // => i1 _. + by rewrite linearZl_LR /= cfdot_cycTIiso neq_j andbF [_ *: _]mulr0. have proj_sum_eta a i j1: '[sum_eta a j1, eta_ i j1] = a i j1. - rewrite cfdot_suml (bigD1 i) //= cfdotZl cfdot_cycTIiso !eqxx mulr1. + rewrite linear_suml (bigD1 i) //= linearZl_LR /= cfdot_cycTIiso !eqxx [_ *: _]mulr1. rewrite big1 ?addr0 // => i1 /negPf i'i1. - by rewrite cfdotZl cfdot_cycTIiso i'i1 mulr0. + by rewrite linearZl_LR /= cfdot_cycTIiso i'i1 [_ *: _]mulr0. have [a Dphi Da0]: exists2 a, phi = sum_eta a k + sum_eta a j & pred2 0 dk (a 0 k) /\ pred2 0 (- dk) (a 0 j). - have uRk: uniq (R (mu k)) by have [_ /orthonormal_free/free_uniq] := Rok _ Sk. @@ -1441,7 +1466,7 @@ have{A1zeta1} zeta1V0: {in V, zeta1 =1 \0}. move=> x Vx; rewrite /= A1zeta1 // -in_setC. apply: subsetP (subsetP (prDade_supp_disjoint ddA) x Vx); rewrite setCS. by rewrite subUset sub1G; have [/= _ _ _ [_ [_ _ /subsetD1P[->]]]] := ddA. -have o_phi_0 i: '[phi, eta_ i 0] = 0 by rewrite Dphi cfdotDl !o_sum_eta ?addr0. +have o_phi_0 i: '[phi, eta_ i 0] = 0 by rewrite Dphi linearDl /= !o_sum_eta ?addr0. have{o_phi_0 zeta1V0} proj_phi0 i ell: '[phi, eta_ i ell] = '[phi, eta_ 0 ell]. rewrite -[LHS]add0r -(o_phi_0 0) -[RHS]addr0 -(o_phi_0 i). apply: (cycTIiso_cfdot_exchange ddA); rewrite -/V => x Vx. @@ -1452,18 +1477,18 @@ have{o_phi_0 zeta1V0} proj_phi0 i ell: '[phi, eta_ i ell] = '[phi, eta_ 0 ell]. rewrite oppr0 mulr0 addr0 mulf_eq0 => /orP[/idPn[] | /eqP->//]. by have /irrP[iz ->] := irr_zeta; apply: irr1_neq0. have Dphi_j i: '[phi, eta_ i j] = a i j. - by rewrite Dphi cfdotDl proj_sum_eta o_sum_eta 1?eq_sym ?add0r. + by rewrite Dphi linearDl /= proj_sum_eta o_sum_eta 1?eq_sym ?add0r. have Dphi_k i: '[phi, eta_ i k] = a i k. - by rewrite Dphi cfdotDl proj_sum_eta o_sum_eta ?addr0. + by rewrite Dphi linearDl /= proj_sum_eta o_sum_eta ?addr0. have Da_j i: a i j = a 0 j by rewrite -!Dphi_j. have{proj_phi0} Da_k i: a i k = a 0 k by rewrite -!Dphi_k. have oW1: #|W1| = #|Iirr W1|. by rewrite card_Iirr_cyclic //; have [[]] := prDade_prTI ddA. have{oW1}: `|a 0 j| ^+ 2 + `|a 0 k| ^+ 2 == 1. apply/eqP/(mulfI (neq0CG W1)); rewrite mulr1 {}[in LHS]oW1. - transitivity '[phi]; last by rewrite Itau1 ?mem_zchar ?cfnorm_prTIred. - rewrite {2}Dphi cfdotDr !cfdot_sumr mulrDr addrC !mulr_natl -!sumr_const. - congr (_ + _); apply: eq_bigr => i _; rewrite cfdotZr mulrC normCK. + transitivity '[phi]; last by rewrite Itau1 /= ?mem_zchar ?cfnorm_prTIred. + rewrite {2}Dphi linearDr !linear_sumr mulrDr addrC !mulr_natl -!sumr_const. + congr (_ + _); apply: eq_bigr => i _; rewrite linearZ /= mulrC normCK. by rewrite Dphi_k (Da_k i). by rewrite Dphi_j (Da_j i). have{Da0}[/pred2P[]Da0k /pred2P[]Da0j] := Da0; rewrite Da0k Da0j; last 2 first. @@ -1489,12 +1514,12 @@ have: phi - tau1 (mu l) = sum_eta ak k - sum_eta ak l. by rewrite -[tau _]Dtau // raddfB /= !Dtau2 2!raddf_sum. have [E /mem_subseq sER ->] := Dtau1S _ Sl. move/esym/(congr1 (cfdotr (eta_ 0 k))); apply: contra_eqT => /norP[k'l j'l] /=. -rewrite !cfdotBl Dphi_k Da0k proj_sum_eta o_sum_eta // cfdot_suml. +rewrite !cfdotBl Dphi_k Da0k proj_sum_eta o_sum_eta // linear_suml. rewrite big_seq big1 ?subr0 ?signr_eq0 // => aa /sER; rewrite defR -map_comp. rewrite mem_cat => /orP[]/codomP[/= i ->]; rewrite -/(eta_ i _). - by rewrite cfdotZl cfdot_cycTIiso (negPf k'l) andbF mulr0. -rewrite cfdotNl cfdotZl cfdot_cycTIiso (inv_eq (@conjC_IirrK _ _)) -/j. -by rewrite (negPf j'l) andbF mulr0 oppr0. + by rewrite linearZl_LR /= cfdot_cycTIiso (negPf k'l) andbF [_ *: _] mulr0. +rewrite linearNl linearZl_LR /= cfdot_cycTIiso (inv_eq (@conjC_IirrK _ _)) -/j. +by rewrite (negPf j'l) andbF [_ *: _]mulr0 oppr0. Qed. Section DadeAut. @@ -1508,7 +1533,7 @@ Local Notation "alpha ^\tau" := (tau alpha). Section DadeAutIrr. Variable u : {rmorphism algC -> algC}. -Local Notation "alpha ^u" := (cfAut u alpha). +Local Notation "alpha ^u" := (cfAut u alpha)( at level 10). (* This is Peterfalvi (5.9)(a), slightly reformulated to allow calS to also *) (* contain non-irreducible characters; for groups of odd order, the second *) @@ -1529,7 +1554,7 @@ have ZAmu j: 'chi_j \in calS -> mu j \in 'Z[calS, L^#]. move=> Sxj; rewrite zcharD1E !cfunE mulrC subrr. by rewrite rpredB //= scale_zchar ?sSZS // ?Cint_Cnat ?Cnat_irr1. have Npsi j: 'chi_j \in calS -> '[tau1 'chi_j] = 1%:R. - by move=> Sxj; rewrite Itau1 ?sSZS ?cfnorm_irr. + by move=> Sxj; rewrite Itau1 /= ?sSZS ?cfnorm_irr. have{Npsi} Dtau1 Sxj := vchar_norm1P (Ztau1 _ (sSZS _ Sxj)) (Npsi _ Sxj). have [e [r tau1_chi]] := Dtau1 _ Schi; set eps := (-1) ^+ e in tau1_chi. have{Dtau1} Dtau1 j: 'chi_j \in calS -> exists t, tau1 'chi_j = eps *: 'chi_t. @@ -1547,9 +1572,9 @@ have SuSirr j: 'chi_j \in calS -> 'chi_(aut_Iirr u j) \in calS. have [j Sxj neq_ij]: exists2 j, 'chi_j \in calS & 'chi_i != 'chi_j. move: irrS_gt1; rewrite (cardsD1 i) inE Schi ltnS card_gt0 => /set0Pn[j]. by rewrite !inE -(inj_eq irr_inj) eq_sym => /andP[]; exists j. -have: (tau1 (mu j))^u == tau1 (mu j)^u. +have: (tau1 (mu j))^u == tau1 ((mu j)^u). by rewrite !tau1_tau ?cfAut_zchar ?ZAmu ?Dade_aut. -rewrite !raddfB [-%R]lock !raddfZ_Cnat ?Cnat_irr1 //= -lock -!aut_IirrE. +rewrite !raddfB [-%R]lock !raddfZ_Cnat /= ?Cnat_irr1 //= -lock -!aut_IirrE. have [/Dtau1[ru ->] /Dtau1[tu ->]] := (SuSirr i Schi, SuSirr j Sxj). have: (tau1 'chi_i)^u != (tau1 'chi_j)^u. apply: contraNneq neq_ij => /cfAut_inj/(isometry_raddf_inj Itau1)/eqP. @@ -1591,8 +1616,8 @@ have Zphi: phi \in 'Z[irr L, A]. have Zphi_tau: phi^\tau \in 'Z[irr G, G^#]. by rewrite zchar_split Dade_cfun Dade_vchar ?Zphi. have norm_phi_tau : '[phi^\tau] = 2%:R. - rewrite Dade_isometry ?(zchar_on Zphi) // cfnormB -conjC_IirrE. - by rewrite !cfdot_irr !eqxx eq_sym (negPf notRchi) rmorph0 addr0 subr0. + rewrite Dade_isometry /= ?(zchar_on Zphi) // hnormB -conjC_IirrE /=. + by rewrite !cfdot_irr !eqxx eq_sym (negPf notRchi) expr0 mul1r rmorph0 addr0 subr0. have [j [k ne_kj phi_tau]] := vchar_norm2 Zphi_tau norm_phi_tau. suffices def_k: conjC_Iirr j = k by exists j; rewrite -conjC_IirrE def_k. have/esym:= eq_subZnat_irr 1 1 k j (conjC_Iirr j) (conjC_Iirr k). diff --git a/theories/PFsection6.v b/theories/PFsection6.v index 7751f31..0316911 100644 --- a/theories/PFsection6.v +++ b/theories/PFsection6.v @@ -14,7 +14,7 @@ Require Import sylow abelian maximal hall frobenius. From mathcomp Require Import matrix mxalgebra mxrepresentation vector ssrnum algC algnum. From mathcomp -Require Import classfun character inertia vcharacter integral_char. +Require Import forms classfun character inertia vcharacter integral_char. From odd_order Require Import PFsection1 PFsection2 PFsection3 PFsection4 PFsection5. @@ -42,6 +42,12 @@ Section Six. Variables (gT : finGroupType) (G : {group gT}). Implicit Types H K L P M W Z : {group gT}. +Notation pairwise_orthogonal := (pairwise_orthogonal [hermitian of @cfdot _ _]). +Notation orthogonal := (orthogonal [hermitian of @cfdot _ _]). +Notation orthonormal := (orthonormal [hermitian of @cfdot _ _]). +Notation orthonormalP := (orthonormalP [dot of @cfdot _ _]). +Notation orthogonal_split := (orthogonal_split [dot of @cfdot _ _]). + (* Grouping lemmas that assume Hypothesis (6.1). *) Section GeneralCoherence. @@ -57,6 +63,7 @@ Hypotheses (nsKL : K <| L) (solK : solvable K). Hypothesis Itau : {in 'Z[calS, L^#] &, isometry tau}. Hypothesis scohS : subcoherent calS tau R. + Let sKL : K \subset L. Proof. exact: normal_sub. Qed. Let nKL : L \subset 'N(K). Proof. exact: normal_norm. Qed. Let orthS: pairwise_orthogonal calS. Proof. by case: scohS. Qed. @@ -712,7 +719,7 @@ have [tau1 cohY]: coherent Y L^# tau. by apply/allP=> _ /mapP[phi Yphi ->]; rewrite /= uniY. have [[Itau1 Ztau1] Dtau1] := cohY. have oYtau: orthonormal (map tau1 Y) by apply: map_orthonormal. -have [[_ oYY] [_ oYYt]] := (orthonormalP oY, orthonormalP oYtau). +have [[_ oYY] [_ oYYt]] := (orthonormalP _ oY, orthonormalP _ oYtau). have [eta1 Yeta1]: {eta1 | eta1 \in Y} by apply: seqIndD_nonempty. pose m : algC := (size Y)%:R; pose m_ub2 a := (a - 1) ^+ 2 + (m - 1) * a ^+ 2. have m_ub2_lt2 a: a \in Cint -> m_ub2 a < 2%:R -> a = 0 \/ a = 1 /\ size Y = 2. @@ -788,18 +795,18 @@ have{odd_frobL1} caseA_cohXY: caseA -> coherent (X ++ Y) L^# tau. rewrite [LHS]dX1 addrC -addrA; congr (_ + _). have{dY1} [_ -> ->] := orthonormal_span oYtau dY1. transitivity (\sum_(xi <- map tau1 Y) '[tau psi1, xi] *: xi). - by apply/eq_big_seq=> xi ?; rewrite dX1 cfdotDl (orthoPl oX1tauY) ?addr0. + by apply/eq_big_seq=> xi ?; rewrite dX1 linearDl /= (orthoPl _ _ _ oX1tauY) ?addr0. rewrite big_map scaler_sumr !(big_rem eta1 Yeta1) /= addrCA addrA scalerDl. rewrite addrK; congr (_ + _); apply: eq_big_seq => eta. rewrite mem_rem_uniq // => /andP[eta1'eta /= Yeta]; congr (_ *: _). apply/(canRL (addNKr _)); rewrite addrC -2!raddfB /=. have Zeta: eta - eta1 \in 'Z[Y, L^#]. by rewrite zcharD1E rpredB ?seqInd_zcharW //= !cfunE !uniY ?subrr. - rewrite Dtau1 // Itau // ?(zchar_subset sYS) // cfdotBl cfdotZl. - rewrite (span_orthogonal oXY) ?rpredB ?memv_span // add0r cfdotBr. + rewrite Dtau1 // Itau // ?(zchar_subset sYS) // linearBl linearZl_LR /=. + rewrite (span_orthogonal oXY) ?rpredB ?memv_span // add0r linearBr /=. by rewrite !oYY // !mulrb eqxx ifN_eqC // sub0r mulrN1 opprK. have oX: orthonormal X by apply: sub_orthonormal (irr_orthonormal L). - have [_ oXX] := orthonormalP oX. + have [_ oXX] := orthonormalP _ oX. have Zxi1Xd xi: xi \in X -> xi - d xi *: xi1 \in 'Z[X, L^#]. move=> Xxi; rewrite zcharD1E !cfunE -def_d // subrr eqxx. by rewrite rpredB ?rpredZnat ?mem_zchar. @@ -808,23 +815,23 @@ have{odd_frobL1} caseA_cohXY: caseA -> coherent (X ++ Y) L^# tau. pose sumXd : 'CF(L) := \sum_(xi <- X) d xi *: xi. have{Dc} [xi2 Dpsi oxi2X]: {xi2 | psi = c *: sumXd + xi2 & orthogonal xi2 X}. exists (psi - c *: sumXd); first by rewrite addrC subrK. - apply/orthoPl=> xi Xxi; rewrite cfdotBl cfdotZl cfproj_sum_orthonormal //. - rewrite mulrC -[d xi]conjCK -Dc -cfdotZr -cfdotBr cfdot_Res_l -conjC0. + apply/orthoPl=> xi Xxi; rewrite linearBl linearZl_LR /= cfproj_sum_orthonormal //. + rewrite mulrC -[d xi]conjCK -Dc -linearZ -cfdotBr cfdot_Res_l -conjC0. rewrite -/tau rmorph_nat -Dtau2 ?Zxi1Xd // raddfB raddfZnat -/(d xi) cfdotC. by rewrite (span_orthogonal o_tauXY) ?rpredB ?rpredZ ?memv_span ?map_f. have Exi2 z: z \in Z -> xi2 z = xi2 1%g. rewrite [xi2]cfun_sum_constt => Zz; apply/cfker1; apply: subsetP z Zz. apply: subset_trans (cfker_sum _ _ _); rewrite subsetI sZL. apply/bigcapsP=> i; rewrite inE => xi2_i; rewrite cfker_scale_nz //. - by apply: contraR xi2_i => X_i; rewrite (orthoPl oxi2X) // defX inE mem_irr. + by apply: contraR xi2_i => X_i; rewrite (orthoPl _ _ _ oxi2X) // defX inE mem_irr. have Eba: '[psi, psi1] = b - a. - rewrite cfdotC cfdot_Res_r -/tau tau_psi1 cfdotDl cfdotBl cfdotZl. - rewrite (orthoPl oX1tauY) 1?oYYt ?map_f // eqxx sub0r addrC mulr1 rmorphB. + rewrite cfdotC cfdot_Res_r -/tau tau_psi1 linearDl linearBl /= linearZl_LR /=. + rewrite (orthoPl _ _ _ oX1tauY) 1?oYYt /= ?map_f // eqxx sub0r addrC [a *: _]mulr1 rmorphB. by rewrite scaler_sumr cfproj_sum_orthonormal // aut_Cint // aut_Cnat. have{Eba oxi2X} Ebc: (a %| b - c)%C. - rewrite -[b](subrK a) -Eba cfdotBr {1}Dpsi cfdotDl cfdotZl. - rewrite cfproj_sum_orthonormal // (orthoPl oxi2X) // addr0 d_xi1 mulr1. - rewrite addrC -addrA addKr addrC rpredB ?dvdC_refl //= cfdotZr aut_Cnat //. + rewrite -[b](subrK a) -Eba cfdotBr {1}Dpsi linearDl linearZl_LR /=. + rewrite cfproj_sum_orthonormal // (orthoPl _ _ _ oxi2X) // addr0 d_xi1 [_ *: _]mulr1. + rewrite addrC -addrA addKr addrC rpredB ?dvdC_refl //= linearZ /= aut_Cnat //. by rewrite dvdC_mulr // Cint_cfdot_vchar ?(seqInd_vcharW Yeta1). have DsumXd: sumXd = (xi1 1%g)^-1 *: (cfReg L - cfReg (L / Z) %% Z)%CF. apply/(canRL (scalerK nz_xi1_1))/(canRL (addrK _)); rewrite !cfReg_sum. @@ -861,23 +868,23 @@ have{odd_frobL1} caseA_cohXY: caseA -> coherent (X ++ Y) L^# tau. by rewrite -(@dvdC_mul2r _ a) ?divfK // mulrC dvdC_mul2l ?neq0CG in dvH_cHa. have{c Ebc dv_ac} /dvdCP[q Zq Db]: (a %| b)%C by rewrite rpredBr in Ebc. have norm_psi1: '[psi1] = 1 + a ^+ 2. - rewrite cfnormBd; last by rewrite cfdotZr (orthogonalP oXY) ?mulr0. - by rewrite cfnormZ norm_Cnat // oXX // oYY // !eqxx mulr1. + rewrite hnormBd; last by rewrite linearZ /= (orthogonalP _ _ _ oXY) ?mulr0. + by rewrite /= dnormZ norm_Cnat // oXX // oYY // !eqxx mulr1. have{Zb oYYt} norm_tau_psi1: '[tau psi1] = '[X1] + a ^+ 2 * m_ub2 q. - rewrite tau_psi1 -addrA cfnormDd /m_ub2; last first. - rewrite addrC big_seq (span_orthogonal oX1tauY) ?memv_span1 //. + rewrite tau_psi1 -addrA hnormDd /m_ub2; last first. + rewrite /= addrC big_seq (span_orthogonal oX1tauY) ?memv_span1 //. by rewrite rpredB ?rpredZ ?rpred_sum // => *; rewrite memv_span ?map_f. congr (_ + _); transitivity (b ^+ 2 * m + a ^+ 2 - a * b *+ 2); last first. rewrite [RHS]mulrC [in RHS]addrC mulrBl sqrrB1 !addrA mulrDl !mul1r subrK. by rewrite mulrBl [m * _]mulrC mulrnAl mulrAC Db exprMn (mulrCA a) addrAC. - rewrite addrC cfnormB !cfnormZ Cint_normK ?norm_Cnat // cfdotZr. + rewrite addrC hnormB /= !dnormZ Cint_normK ?norm_Cnat // linearZ /=. rewrite cfnorm_map_orthonormal // -/m linear_sum cfproj_sum_orthonormal //. - by rewrite oYYt ?map_f // eqxx mulr1 rmorphM conjCK aut_Cnat ?aut_Cint. + by rewrite oYYt ?map_f // eqxx expr0 mul1r mulr1 rmorphM conjCK aut_Cnat ?aut_Cint. have{norm_tau_psi1} mq2_lt2: m_ub2 q < 2%:R. suffices a2_gt1: a ^+ 2 > 1. have /ltr_pmul2l <-: a ^+ 2 > 0 by apply: ltr_trans a2_gt1. rewrite -(ltr_add2l '[X1]) -norm_tau_psi1 ltr_paddl ?cfnorm_ge0 //. - by rewrite Itau // mulr_natr norm_psi1 ltr_add2r. + by rewrite Itau // mulr_natr /= norm_psi1 ltr_add2r. suffices a_neq1: a != 1. rewrite expr_gt1 ?Cnat_ge0 // ltr_neqAle eq_sym a_neq1. by rewrite -(norm_Cnat Na) norm_Cint_ge1 ?Cint_Cnat. @@ -899,16 +906,16 @@ have{odd_frobL1} caseA_cohXY: caseA -> coherent (X ++ Y) L^# tau. by move=> _ /mapP[eta Yeta ->]; rewrite /= map_f ?ccY. apply: IH (dual_coherence scohY cohY szY2) _ _ _. - rewrite (map_comp -%R) orthogonal_oppr. - by apply/orthogonalP=> phi psi ? /memYtau1c; apply: (orthogonalP o_tauXY). + by apply/(orthogonalP _ _)=> phi psi ? /memYtau1c; apply: (orthogonalP _ _ _ o_tauXY). - rewrite (map_comp -%R) orthogonal_oppr. - by apply/orthoPl=> psi /memYtau1c; apply: (orthoPl oX1tauY). + by apply/orthoPl=> psi /memYtau1c; apply: (orthoPl _ _ _ oX1tauY). rewrite tau_psi1 (eq_big_perm _ defY) Db q1 /= mul1r big_cons big_seq1. by rewrite scalerDr addrA subrK -scalerN opprK. have [[Itau1 Ztau1] Dtau1] := cohY. have n1X1: '[X1] = 1. rewrite -(canLR (addrK _) norm_psi1) -Itau // tau_psi1. - rewrite cfnormBd; last by rewrite cfdotZr (orthoPl oX1tauY) ?map_f ?mulr0. - by rewrite cfnormZ norm_Cnat // Itau1 ?mem_zchar ?oYY // eqxx mulr1 addrK. + rewrite hnormBd; last by rewrite linearZ /= (orthoPl _ _ _ oX1tauY) ?map_f ?mulr0. + by rewrite /= dnormZ /= norm_Cnat // Itau1 /= ?mem_zchar ?oYY // eqxx mulr1 addrK. without loss{Itau2 Ztau2 Dtau2} defX1: tau2 cohX o_tauXY / X1 = tau2 xi1. move=> IH; have ZX: {subset X <= 'Z[X]} by apply: seqInd_zcharW. have dirrXtau xi: xi \in X -> tau2 xi \in dirr G. @@ -919,12 +926,12 @@ have{odd_frobL1} caseA_cohXY: caseA -> coherent (X ++ Y) L^# tau. have{Zxi1Xd} oXdX1 xi: xi \in X -> xi != xi1 -> '[d xi *: tau2 xi1 - tau2 xi, X1] = d xi. - move=> Xxi xi1'xi; have ZXxi := Zxi1Xd xi Xxi. - rewrite -(canLR (subrK _) tau_psi1) cfdotDr addrC. + rewrite -(canLR (subrK _) tau_psi1) linearDr addrC /=. rewrite (span_orthogonal o_tauXY) ?rpredB ?rpredZ ?memv_span ?map_f //. - rewrite add0r -opprB cfdotNl -{1}raddfZ_Cnat ?Cnat_nat // -raddfB. - rewrite Dtau2 // Itau ?cfdotBr ?opprB //; last exact: zchar_subset ZXxi. - rewrite (span_orthogonal oXY) ?rpredB ?rpredZ ?memv_span // sub0r. - by rewrite cfdotBl cfdotZl opprB !oXX // eqxx mulr1 mulrb ifN ?subr0. + rewrite add0r -opprB linearNl -{1}raddfZ_Cnat ?Cnat_nat // -raddfB /=. + rewrite Dtau2 // Itau /= ?cfdotBr ?opprB //; last exact: zchar_subset ZXxi. + rewrite /= (span_orthogonal oXY) /= ?rpredB ?rpredZ ?memv_span /= // sub0r. + by rewrite linearBl linearZl_LR /= opprB !oXX // eqxx [_ *: _] mulr1 mulrb ifN ?subr0. pose xi3 := xi1^*%CF; have Xxi3: xi3 \in X by apply: ccX. have xi1'3: xi3 != xi1 by rewrite (hasPn nrS) ?sXS. have [| defX1]: X1 = tau2 xi1 \/ X1 = - tau2 xi3; first 2 [exact : IH]. @@ -934,11 +941,11 @@ have{odd_frobL1} caseA_cohXY: caseA -> coherent (X ++ Y) L^# tau. have szX2: (size X <= 2)%N. apply: uniq_leq_size (xi1 :: xi3) uX _ => // xi4 Xxi4; rewrite !inE. apply: contraR (seqInd1_neq0 nsHL Xxi4) => /norP[xi1'4 xi3'4]. - rewrite def_d // -oXdX1 // defX1 cfdotNr cfdotBl cfdotZl opprB. - by rewrite !Itau2 ?ZX ?oXX // !mulrb ifN ?ifN_eqC // mulr0 subr0 mul0r. + rewrite def_d // -oXdX1 // defX1 linearNr linearBl /= linearZl_LR /= opprB. + by rewrite !Itau2 /= ?ZX ?oXX // !mulrb ifN ?ifN_eqC // [_ *: _]mulr0 subr0 mul0r. apply: (IH _ (dual_coherence scohX cohX szX2)) defX1. apply/orthogonalP=> _ psi2 /mapP[xi Xxi -> /=] Ytau_psi2. - by rewrite cfdotNl (orthogonalP o_tauXY) ?oppr0 // map_f ?ccX. + by rewrite linearNl /= (orthogonalP _ _ _ o_tauXY) ?oppr0 // map_f ?ccX. rewrite -raddfZ_Cnat // defX1 in tau_psi1. apply: (bridge_coherent scohS ccsXS cohX ccsYS cohY X'Y) tau_psi1. by rewrite (zchar_on Zpsi1) rpredZ_Cnat ?mem_zchar. @@ -990,7 +997,7 @@ have{caseA_cohXY Itau1 Ztau1 Dtau1 oYYt} cohXY: coherent (X ++ Y) L^# tau. by rewrite -natrM mulnC Lagrange. have psi1Z z: z \in Z^# -> psi1 z = b by apply: regYZ. have /dirrP[e [i /(canLR (signrZK e))-Epsi1]]: psi1 \in dirr G. - have [_ oYt] := orthonormalP oYtau. + have [_ oYt] := orthonormalP _ oYtau. by rewrite dirrE oYt ?map_f // !eqxx Ztau1 ?seqInd_zcharW. have Zz: z0 \in Z^# by rewrite !inE -cycle_eq1 -cycle_subG -cycZ ntZ /=. have [z1 z2 Zz1 Zz2 |_] := irrZmodH i _ _ Zz. @@ -1019,30 +1026,30 @@ have{caseA_cohXY Itau1 Ztau1 Dtau1 oYYt} cohXY: coherent (X ++ Y) L^# tau. & tau (gamma i) = X1 - #|H : Z|%:R *: Y1. - have [lin_i Xchi Zgamma] := IndZfacts i nzi. have Da: '[tau (gamma i), psi1] = a - #|H : Z|%:R * x1. - rewrite !(=^~ cfdot_Res_r, cfdotBl) cfResRes // cfdotZl -/x1 Dpsi1. - congr (_ - _); rewrite cfdotDr cfReg_sum cfdotC cfdotZl cfdotZr. + rewrite !(=^~ cfdot_Res_r, cfdotBl) cfResRes // linearZl_LR /= -/x1 Dpsi1. + congr (_ - _); rewrite linearDr cfReg_sum /= cfdotC /= linearZ linearZl_LR /=. rewrite -(big_tuple _ _ _ xpredT (fun xi : 'CF(Z) => xi 1%g *: xi)). - rewrite cfproj_sum_orthonormal ?irr_orthonormal ?mem_irr // lin_i mulr1. + rewrite cfproj_sum_orthonormal ?irr_orthonormal ?mem_irr // lin_i [_ *: _]mulr1. rewrite -irr0 cfdot_irr (negPf nzi) mulr0 addr0. by rewrite aut_Cint // Dx0 rpredM ?rpred_nat. exists (tau (gamma i) + #|H : Z|%:R *: Y1); last by rewrite addrK. apply/orthoPl=> _ /mapP[eta Yeta ->]. - rewrite scalerN cfdotBl cfdotZl cfproj_sum_orthonormal // [x]addrAC. + rewrite scalerN linearBl linearZl_LR /= cfproj_sum_orthonormal // [x]addrAC. rewrite -addrA mulrDr mulrBr mulrC -Dx0 -Da opprD addrA -!raddfB /=. have Yeta_1: eta - eta1 \in 'Z[Y, L^#]. by rewrite zcharD1E rpredB ?seqInd_zcharW //= !cfunE !uniY ?subrr. - rewrite Dtau1 ?Itau // ?(zchar_subset sYS) // cfdotBl cfdotZl. + rewrite Dtau1 ?Itau // ?(zchar_subset sYS) // linearBl linearZl_LR /=. rewrite (span_orthogonal oXY) ?(zchar_span Xchi) ?(zchar_span Yeta_1) //. by rewrite cfdotBr -mulrN opprB !oYY // eqxx eq_sym addrK. have [i0 nz_i0] := has_nonprincipal_irr ntZ. exists Y1 => //; have{Dgamma} [X1 oX1Y Dgamma] := Dgamma i0 nz_i0. have [lin_i Xchi Zgamma] := IndZfacts i0 nz_i0. have norm_gamma: '[tau (gamma i0)] = (#|L : Z| + #|H : Z| ^ 2)%:R. - rewrite natrD Itau // cfnormBd; last first. - rewrite (span_orthogonal oXY) ?(zchar_span Xchi) //. + rewrite natrD Itau // hnormBd; last first. + rewrite /= (span_orthogonal oXY) ?(zchar_span Xchi) //. by rewrite memvZ ?memv_span. - rewrite cfnorm_Ind_irr //; congr (#|_ : Z|%:R + _); last first. - by rewrite cfnormZ oYY // eqxx mulr1 normCK rmorph_nat -natrM. + rewrite /= cfnorm_Ind_irr //; congr (#|_ : Z|%:R + _); last first. + by rewrite dnormZ oYY // eqxx mulr1 normCK rmorph_nat -natrM. by apply/setIidPl; rewrite (subset_trans _ (cent_sub_inertia _)) 1?centsC. have{norm_gamma} ub_norm_gamma: '[tau (gamma i0)] < (#|H : Z| ^ 2).*2%:R. rewrite norm_gamma -addnn ltr_nat ltn_add2r. @@ -1059,11 +1066,11 @@ have{caseA_cohXY Itau1 Ztau1 Dtau1 oYYt} cohXY: coherent (X ++ Y) L^# tau. have{ub_norm_gamma} ub_xm: m_ub2 x < 2%:R. have: '[Y1] < 2%:R. rewrite -2!(ltr_pmul2l (gt0CiG H Z)) -!natrM mulnA muln2. - apply: ler_lt_trans ub_norm_gamma; rewrite Dgamma cfnormBd. - by rewrite cfnormZ normCK rmorph_nat mulrA -subr_ge0 addrK cfnorm_ge0. - rewrite (span_orthogonal oX1Y) ?memv_span1 ?rpredZ // rpredN big_seq. + apply: ler_lt_trans ub_norm_gamma; rewrite Dgamma hnormBd. + by rewrite /= dnormZ normCK rmorph_nat mulrA -subr_ge0 addrK cfnorm_ge0. + rewrite /= (span_orthogonal oX1Y) ?memv_span1 ?rpredZ // rpredN big_seq. by apply/rpred_sum => eta Yeta; rewrite rpredZ ?memv_span ?map_f. - rewrite cfnormN cfnorm_sum_orthonormal // (big_rem eta1) //= eqxx. + rewrite hnormN /= cfnorm_sum_orthonormal // (big_rem eta1) //= eqxx. congr (_ + _ < _); first by rewrite Cint_normK 1?rpredB ?rpred1. transitivity (\sum_(eta <- rem eta1 Y) x ^+ 2). rewrite rem_filter // !big_filter; apply/eq_bigr => eta /negPf->. @@ -1086,7 +1093,7 @@ have{caseA_cohXY Itau1 Ztau1 Dtau1 oYYt} cohXY: coherent (X ++ Y) L^# tau. by rewrite scale1r. have normY1: '[Y1] = 1. have [-> | [_ ->]] := defY1; first by rewrite oYYt ?eqxx ?map_f. - by rewrite cfnormN oYYt ?eqxx ?map_f ?ccY. + by rewrite hnormN /= oYYt ?eqxx ?map_f ?ccY. have YtauY1: Y1 \in 'Z[map tau1 Y]. have [-> | [_ ->]] := defY1; first by rewrite mem_zchar ?map_f. by rewrite rpredN mem_zchar ?map_f ?ccY. @@ -1111,13 +1118,13 @@ have{caseA_cohXY Itau1 Ztau1 Dtau1 oYYt} cohXY: coherent (X ++ Y) L^# tau. have{chi defRk defRkZ} defRk: 'Res[Z] 'chi_k = a *: 'chi_i. by rewrite -defRk -linearZ -defRkZ /= cfResRes ?cfcenter_sub. exists i => //; apply: contra kerZ'k => i_0; apply/constt0_Res_cfker=> //. - by rewrite inE defRk cfdotZl cfdot_irr i_0 mulr1 irr1_neq0. + by rewrite inE defRk linearZl_LR /= cfdot_irr i_0 [_ *: _]mulr1 irr1_neq0. set phi := 'chi_i0 in Res_k; pose a_ i := '['Ind[H] phi, 'chi_i]. pose rp := irr_constt ('Ind[H] phi). have defIphi: 'Ind phi = \sum_(i in rp) a_ i *: 'chi_i. exact: cfun_sum_constt. have a_k: a_ k = a. - by rewrite /a_ -cfdot_Res_r Res_k cfdotZr cfnorm_irr mulr1 conj_Cnat. + by rewrite /a_ -cfdot_Res_r Res_k linearZ /= cfnorm_irr mulr1 conj_Cnat. have rp_k: k \in rp by rewrite inE ['[_, _]]a_k irr1_neq0. have resZr i: i \in rp -> 'Res[Z] 'chi_i = a_ i *: phi. rewrite constt_Ind_Res -/phi => /Clifford_Res_sum_cfclass-> //. @@ -1158,7 +1165,7 @@ have{caseA_cohXY Itau1 Ztau1 Dtau1 oYYt} cohXY: coherent (X ++ Y) L^# tau. have Xchi i: i \in rp -> chi i \in X. move=> rp_i; apply/seqIndP; exists i => //; rewrite !inE sub1G andbT. apply: contra rp_i => kerZi; rewrite -cfdot_Res_r cfRes_sub_ker //. - by rewrite cfdotZr -irr0 cfdot_irr (negPf nzi0) mulr0. + by rewrite linearZ -irr0 /= cfdot_irr (negPf nzi0) mulr0. have oRY i: i \in rp -> orthogonal (R (chi i)) (map tau1 Y). move/Xchi=> Xchi_i; rewrite orthogonal_sym. by rewrite (coherent_ortho_supp scohS) // ?sXS // (contraL (X'Y _)). @@ -1179,15 +1186,15 @@ have{caseA_cohXY Itau1 Ztau1 Dtau1 oYYt} cohXY: coherent (X ++ Y) L^# tau. have [_ -> ->] := orthonormal_span oRR dX1. rewrite big_seq rpred_sum // => aa Raa. rewrite rpredZ_Cint ?mem_zchar // -(canLR (addrK _) dXYZ) cfdotBl. - by rewrite (orthoPl oYZ1R) // subr0 Cint_cfdot_vchar ?(ZR aa). + by rewrite (orthoPl _ _ _ oYZ1R) // subr0 Cint_cfdot_vchar ?(ZR aa). pose b := - '[YZ1, Y1]; exists b => [rp_i|]. - rewrite Creal_Cint // rpredN -(canLR (addKr _) dXYZ) cfdotDl. - rewrite (span_orthogonal (oRY i rp_i)) ?rpredN ?(zchar_span YtauY1) //. + rewrite Creal_Cint // rpredN -(canLR (addKr _) dXYZ) linearDl. + rewrite /= (span_orthogonal (oRY i rp_i)) ?rpredN ?(zchar_span YtauY1) //. rewrite add0r Cint_cfdot_vchar // (zchar_trans_on _ YtauY1) //. by move=> _ /mapP[eta Yeta ->]; rewrite Ztau1 ?mem_zchar. exists (YZ1 + b *: Y1) => [/oRY-oRiY|]; last first. - by rewrite addrCA subrK addrC cfdotDl cfdotZl normY1 mulr1 addrN. - apply/orthoPl=> aa Raa; rewrite cfdotDl (orthoPl oYZ1R) // add0r. + by rewrite addrCA subrK addrC linearDl linearZl_LR /= normY1 [_ *: _]mulr1 addrN. + apply/orthoPl=> aa Raa; rewrite linearDl /= (orthoPl _ _ _ oYZ1R) // add0r. by rewrite cfdotC (span_orthogonal oRiY) ?conjC0 ?rpredZ // memv_span. case/all_and2=> defXbZ oZY1; have spanR_X1 := zchar_span (R_X1 _ _). have ub_alpha i: i \in rp -> @@ -1197,7 +1204,7 @@ have{caseA_cohXY Itau1 Ztau1 Dtau1 oYYt} cohXY: coherent (X ++ Y) L^# tau. & exists2 E, subseq E (R (chi i)) & X1 i = \sum_(aa <- E) aa]]. + move=> rp_i; apply: (subcoherent_norm scohS) (erefl _) _. * rewrite sXS ?Xchi ?rpredZ_Cint /orthogonal //; split=> //=. - by rewrite !cfdotZr !(orthogonalP oXY) ?mulr0 ?eqxx ?ccX // Xchi. + by rewrite !linearZ /= !(orthogonalP _ _ _ oXY) ?mulr0 ?eqxx ?ccX // Xchi. * have [[/(_ _ _)/char_vchar-Z_S _ _] IZtau _ _ _] := scohS. apply: sub_iso_to IZtau; [apply: zchar_trans_on | exact: zcharW]. apply/allP; rewrite /= zchar_split (cfun_onS (setSD _ sHL)) ?Aalpha //. @@ -1206,25 +1213,25 @@ have{caseA_cohXY Itau1 Ztau1 Dtau1 oYYt} cohXY: coherent (X ++ Y) L^# tau. suffices oYZ_R: orthogonal (b i *: Y1 - Z1 i) (R (chi i)). rewrite opprD opprK addrA -defXbZ cfdotC. by rewrite (span_orthogonal oYZ_R) ?memv_span1 ?spanR_X1 ?conjC0. - apply/orthoPl=> aa Raa; rewrite cfdotBl (orthoPl (oZ1R i _)) // cfdotC. + apply/orthoPl=> aa Raa; rewrite linearBl /= (orthoPl _ _ _ (oZ1R i _)) // cfdotC. by rewrite subr0 (span_orthogonal (oRY i _)) ?conjC0 ?rpredZ // memv_span. have leba i: i \in rp -> b i <= a_ i. move=> rp_i; have ai_gt0: a_ i > 0 by rewrite -Da_ ?irr1_gt0. rewrite (ler_trans (real_ler_norm (Rb i _))) //. rewrite -(@ler_pexpn2r _ 2) ?qualifE ?(ltrW ai_gt0) ?norm_ger0 //. apply: ler_trans (_ : '[b i *: Y1 - Z1 i] <= _). - rewrite cfnormBd; last by rewrite cfdotZl cfdotC oZY1 ?conjC0 ?mulr0. - by rewrite cfnormZ normY1 mulr1 ler_addl cfnorm_ge0. - rewrite -(ler_add2l '[X1 i]) -cfnormBd; last first. - rewrite cfdotBr cfdotZr (span_orthogonal (oRY i _)) ?spanR_X1 //. + rewrite hnormBd; last by rewrite linearZl_LR /= cfdotC oZY1 ?conjC0 ?mulr0. + by rewrite /= dnormZ /= normY1 mulr1 ler_addl cfnorm_ge0. + rewrite -(ler_add2l '[X1 i]) -hnormBd; last first. + rewrite linearBr linearZ /= (span_orthogonal (oRY i _)) ?spanR_X1 //. rewrite mulr0 sub0r cfdotC. by rewrite (span_orthogonal (oZ1R i _)) ?raddf0 ?memv_span1 ?spanR_X1. have Salpha: alpha i \in 'Z[S, L^#]. rewrite zcharD1_seqInd // zchar_split Aalpha // andbT. by rewrite rpredB ?rpredZ_Cint ?mem_zchar ?(sYS eta1) ?sXS ?Xchi. rewrite opprD opprK addrA -defXbZ ?Itau //. - rewrite cfnormBd; last by rewrite cfdotZr (orthogonalP oXY) ?mulr0 ?Xchi. - rewrite cfnormZ Cint_normK ?(oYY eta1) // eqxx mulr1 ler_add2r. + rewrite hnormBd; last by rewrite linearZ /= (orthogonalP _ _ _ oXY) ?mulr0 ?Xchi. + rewrite /= dnormZ Cint_normK ?(oYY eta1) // eqxx mulr1 ler_add2r. by have lbX1i: '[chi i] <= '[X1 i] by have [] := ub_alpha i rp_i. have{leba} eq_ab: {in rp, a_ =1 b}. move=> i rp_i; apply/eqP; rewrite -subr_eq0; apply/eqP. @@ -1232,12 +1239,12 @@ have{caseA_cohXY Itau1 Ztau1 Dtau1 oYYt} cohXY: coherent (X ++ Y) L^# tau. move: i rp_i; apply: psumr_eq0P => [i rp_i | ]. by rewrite subr_ge0 ler_pmul2l ?leba // -Da_ ?irr1_gt0. have [X2 oX2Y /(congr1 (cfdotr Y1))] := tau_gamma i0 nzi0. - rewrite sumrB sum_a2 sum_alpha /tau linear_sum /= cfdot_suml cfdotBl. + rewrite sumrB sum_a2 sum_alpha /tau linear_sum /= linear_suml linearBl /=. rewrite (span_orthogonal oX2Y) ?memv_span1 ?(zchar_span YtauY1) // add0r. - rewrite cfdotZl normY1 mulr1 => /(canLR (@opprK _)) <-. + rewrite linearZl_LR /= normY1 [_ *: _]mulr1 => /(canLR (@opprK _)) <-. rewrite -opprD -big_split big1 ?oppr0 //= => i rp_i. - rewrite linearZ cfdotZl /= -/tau defXbZ addrC cfdotDl oZY1 addr0. - rewrite cfdotBl cfdotZl normY1 mulr1 mulrBr addrC subrK. + rewrite linearZ linearZl_LR /= -/tau defXbZ addrC linearDl /= oZY1 addr0. + rewrite linearBl linearZl_LR /= normY1 [_%:A]mulr1 [_ *: (_ - _)]mulrBr addrC subrK. by rewrite (span_orthogonal (oRY i _)) ?spanR_X1 ?mulr0. exists (X1 k). apply/orthoPl=> psi /memv_span Ypsi. @@ -1245,10 +1252,10 @@ have{caseA_cohXY Itau1 Ztau1 Dtau1 oYYt} cohXY: coherent (X ++ Y) L^# tau. apply/eqP; rewrite -/a def_xi -a_k defXbZ addrC -subr_eq0 eq_ab // addrK. rewrite -cfnorm_eq0 -(inj_eq (addrI '[b k *: Y1])). have [_ [|_]] := ub_alpha k rp_k. - rewrite cfnormBd; last by rewrite cfdotZl cfdotC oZY1 conjC0 mulr0. - by rewrite addrC !cfnormZ eq_ab // normY1 norm_eta1 ler_addr cfnorm_ge0. - rewrite cfnormBd; last by rewrite cfdotZl cfdotC oZY1 conjC0 mulr0. - by move=> -> _; rewrite addr0 !cfnormZ eq_ab // normY1 norm_eta1. + rewrite hnormBd; last by rewrite linearZl_LR /= cfdotC oZY1 conjC0 mulr0. + by rewrite addrC /= !dnormZ eq_ab //= normY1 norm_eta1 ler_addr cfnorm_ge0. + rewrite hnormBd; last by rewrite linearZl_LR/= cfdotC oZY1 conjC0 mulr0. + by move=> -> _; rewrite addr0 !dnormZ /= eq_ab // normY1 norm_eta1. have scohXY: subcoherent (X ++ Y) tau R. apply/(subset_subcoherent scohS). split; first by rewrite cat_uniq uX uY andbT; apply/hasPn. @@ -1261,13 +1268,13 @@ have{caseA_cohXY Itau1 Ztau1 Dtau1 oYYt} cohXY: coherent (X ++ Y) L^# tau. move=> xi /andP[eta1'xi]; rewrite /= mem_cat => /orP[Xxi | Yxi]. have [Da1 [X1 oX1Y tauX1]] := Dxa _ Xxi. exists (a xi); first by rewrite (uniY _ Yeta1). - rewrite -/tau {}tauX1 cfdotBl cfdotZl normY1 !mulr1. - by rewrite (span_orthogonal oX1Y) ?add0r ?memv_span1. + rewrite -/tau {}tauX1 linearBl linearZl_LR /= normY1 !mulr1. + by rewrite (span_orthogonal oX1Y) ?add0r ?memv_span1 ?[_%:A]mulr1. exists 1; first by rewrite rpred1 mul1r !uniY. rewrite scale1r mulr1 -/tau -Dtau1 ?raddfB ?cfdotBl; last first. by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE !uniY ?subrr. - have [-> | [szY2 ->]] := defY1; rewrite ?cfdotNr !Itau1 ?mem_zchar ?ccY //. - by rewrite !oYY // eqxx (negPf eta1'xi) add0r. + have [-> | [szY2 ->]] := defY1; rewrite ?linearNr /= !Itau1 ?mem_zchar ?ccY //. + by rewrite /= !oYY // eqxx (negPf eta1'xi) add0r. pose Y2 := eta1 :: eta1^*%CF; suffices: xi \in Y2. rewrite opprK !inE (negPf eta1'xi) /= => /eqP->. by rewrite !oYY ?ccY // !mulrb eqxx ifN_eqC ?(hasPn nrS) ?sYS ?addr0. diff --git a/theories/PFsection7.v b/theories/PFsection7.v index 1c8f8ab..d95ba59 100644 --- a/theories/PFsection7.v +++ b/theories/PFsection7.v @@ -14,7 +14,7 @@ Require Import matrix mxalgebra mxrepresentation. From odd_order Require Import BGsection3. From mathcomp -Require Import vector ssrnum algC classfun character inertia vcharacter. +Require Import vector ssrnum algC forms classfun character inertia vcharacter. From odd_order Require Import PFsection1 PFsection2 PFsection4 PFsection5 PFsection6. @@ -41,6 +41,13 @@ Section Seven. Variables (gT : finGroupType) (G : {group gT}). Implicit Types (L H P : {group gT}) (DH : gT -> {group gT}). +Notation pairwise_orthogonal := (pairwise_orthogonal [hermitian of @cfdot _ _]). +Notation orthogonal := (orthogonal [hermitian of @cfdot _ _]). +Notation orthonormal := (orthonormal [hermitian of @cfdot _ _]). +Notation orthonormalP := (orthonormalP [dot of @cfdot _ _]). +Notation orthogonal_split := (orthogonal_split [dot of @cfdot _ _]). + + (* Properties of the inverse to the Dade isometry (Peterfalvi (7.1) to (7.3). *) Section InverseDade. @@ -119,7 +126,7 @@ 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. +rewrite -(subrK chi1 chi) -/mu addrC hnormD /= owv conjC0 mulr0 !addr0. split; first by rewrite -subr_ge0 addrC addKr cfnorm_ge0. by rewrite eq_sym addrC -subr_eq0 addrK. Qed. @@ -308,16 +315,16 @@ have part_a: {in A, chi^\rho =1 chi0}. 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 linear_suml big1_seq //= => xi Sxi; have Txi := sST xi Sxi. + rewrite linearZl_LR linearBr /= -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). + 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. + rewrite cfdotBl cfdotC cfproj_sum_orthogonal {oSS}// linearZl_LR linear_sumr /=. + rewrite big1_seq ?mulr0 => [|mu Smu]; last by rewrite linearZ /= o_xi0S ?mulr0. + by rewrite [ (d xi) *: _]mulr0 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. @@ -381,19 +388,19 @@ 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. + move=> Spsi; apply/eqP; rewrite -subr_eq0 -linearZl_LR -linearBl /=. 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. + by rewrite linearBl linearZl_LR /= !oS1 // [_ *: _]mulr0 subr0. suffices oz1: '[nu zeta, 1] = 0. - by apply/orthoPr=> _ /mapP[psi Spsi ->]; rewrite dotSnu1 // oz1 mulr0. + 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. + rewrite defz linearZl_LR /= -{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. + rewrite -InuS // defz t0 linearZ /= irr0 dotSnu1 // mulrCA -irr0 -t0. + by rewrite -linearZ -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. @@ -406,8 +413,8 @@ 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. + move=> xi Sxi; rewrite (canRL (subrK 1) def_beta1) !linearDl /= 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. @@ -415,11 +422,11 @@ have {a_ def_a defX} defX: X = - nu zeta + a *: sumSnu. 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 mulrC -(conj_Cnat (NatS1e _ Sxi)) -linearZ -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. + rewrite Dade_isometry ?(zchar_on Spi) //= cfdotC linearBl linearZl_LR !linearBr /=. + 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. @@ -432,13 +439,13 @@ split=> // [ | chi /irrP[t def_chi] o_chiSnu]. 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 := _ - _. + rewrite -scalerBr linearZ linearZl_LR /=; 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. + by rewrite linearBl !linearZl_LR /= (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. + by rewrite /a -c2 -linearDl -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). @@ -451,16 +458,16 @@ split=> // [ | chi /irrP[t def_chi] o_chiSnu]. 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. + rewrite Dade_isometry // hnormBd /= ?cfnorm_Ind_cfun1 ?Nzeta1 //=. + by rewrite cfdotC /= (seqInd_ortho_Ind1 _ _ Szeta) ?conjC0. + rewrite -[beta](subrK 1) hnormDd; last first. + by rewrite linearBl /= dot_beta_1 cfnorm1 subrr. + rewrite /= cfnorm1 addrK def_beta1 (addrC X) hnormDd; 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 defX (addrC (- nu _)) hnormB /= dnormZ Cint_normK // InuS //=. + rewrite linearZl_LR /= cfproj_sum_orthogonal // Nzeta1 zeta1 divff // divr1. + rewrite expr0 !mulr1 [_%:A]mulr1 mul1r 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. @@ -488,7 +495,7 @@ have def_chi0: {in A, chi^\rho =1 (fun _ => '[beta, chi])}. 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. + by rewrite linearZl_LR /= !(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 (_ * _). @@ -594,7 +601,7 @@ have Delta_context L H (A := H^#) ddA (tau := Dade ddA) nu zeta : 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 linearDl /= {}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 /=. @@ -604,7 +611,7 @@ 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. +rewrite linearDl !linearDr /= disjoint_Dade_ortho // add0r addrC cfdotC. apply: contra => /andP[/eqP-> /eqP->]; rewrite conjC0 add0r addr0. by rewrite (disjoint_coherent_ortho cohS1 cohS2) ?dvdC0. Qed. @@ -699,8 +706,8 @@ have{DH DH1 nu_Ind} cohS i: coherent_with (S i) (L i)^# (tau i) (nu i). 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}. + 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. @@ -758,42 +765,42 @@ suffices{min_rho1} sumB_max: sumB <= (e - 1) / (h + 2%:R). 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. + by rewrite -(hnorm_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]. + rewrite neq_i subr_ge0 def_chi1 linearZ 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. + by rewrite -def_chi1 linearZ /= 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. + move/o_nu=> o_ij Sxi; rewrite linear_suml big1_seq //= => pi Spi. + by rewrite linearZl_LR /= 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. + move/o_phi_nu=> o_ij; rewrite linear_sumr big1_seq // => xi Sxi. + by rewrite linearZ /= 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. +have{betaP def_beta1} /hnormDd->: '[Gamma1, X] = 0. + rewrite linear_sumr big1 // => i Bi; have [neq_i _] := setIdP Bi. + rewrite linearZ /= linear_sumr big1_seq ?mulr0 //= => xi Sxi. + apply/eqP; rewrite linearZ /= linearBl mulf_eq0; apply/pred2P; right. + rewrite linear_suml (bigD1 i) ?big1 //= => [|j /andP[_ neq_j]]; last first. + by rewrite linearZl_LR /= o_phi_nu ?[_ *: _]mulr0. + rewrite linearZl_LR /= 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. + rewrite !(linearDl, linearNl) linearZl_LR /= 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). + 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 /=. + rewrite mulrC -(conj_Cnat Nxie) [_ *:_]mulrC -linearZ -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 -subr_ge0 linear_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. @@ -801,9 +808,9 @@ have n_phi: '[phi i] = (h_ i - 1) / e_ i. 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 subr_ge0 linearZr_LR linear_suml (bigD1 i) //=. +rewrite big1 ?addr0 => [|j /andP[_ ne_j]]; last by rewrite linearZl_LR /= o_phi ?[_ *:_]mulr0. +rewrite linearZl_LR 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 //. diff --git a/theories/PFsection8.v b/theories/PFsection8.v index 68acef7..4a7babd 100644 --- a/theories/PFsection8.v +++ b/theories/PFsection8.v @@ -20,7 +20,7 @@ Require Import BGsection14 BGsection15 BGsection16. From mathcomp Require ssrnum. From mathcomp -Require Import algC classfun character inertia vcharacter. +Require Import algC forms classfun character inertia vcharacter. From odd_order Require Import PFsection1 PFsection2 PFsection3 PFsection4 PFsection5. @@ -106,6 +106,13 @@ Local Notation G := (TheMinSimpleOddGroup gT). Implicit Types (p q : nat) (x y z : gT) (A B : {set gT}). Implicit Types H K L M N P Q R S T U V W : {group gT}. +Notation pairwise_orthogonal := (pairwise_orthogonal [hermitian of @cfdot _ _]). +Notation orthogonal := (orthogonal [hermitian of @cfdot _ _]). +Notation orthonormal := (orthonormal [hermitian of @cfdot _ _]). +Notation orthonormalP := (orthonormalP [dot of @cfdot _ _]). +Notation orthogonal_split := (orthogonal_split [dot of @cfdot _ _]). + + (* Peterfalvi, Definition (8.1) is covered by BGsection16.of_typeF. *) (* This is the remark following Definition (8.1). *) @@ -850,7 +857,7 @@ Lemma coherent_ortho_cycTIiso calS1 (tau1 : {additive 'CF(M) -> 'CF(G)}) : Proof. move=> ccsS1S cohS1 chi i j S1chi chi_irr; have [_ sS1S _] := ccsS1S. have [e /mem_subseq Re ->] := mem_coherent_sum_subseq scohS ccsS1S cohS1 S1chi. -rewrite cfdot_suml big1_seq // => xi /Re; apply: orthoPr. +rewrite linear_suml big1_seq // => xi /Re; apply: orthoPr. by apply: FTtypeP_base_ortho (mem_irr _); rewrite !inE sS1S. Qed. @@ -874,7 +881,7 @@ have Dmu := coherent_prDade_TIred FT_prDade_hyp ccsS1S irrS1 cohS1. rewrite -/mu_ -/d in Dmu; pose mu_sum d1 k1 := (-1) ^+ d1 *: (\sum_i eta_ i k1). have mu_sumK (d1 d2 : bool) k1 k2: ('[mu_sum d1 k1, (-1) ^+ d2 *: eta_ 0 k2] > 0) = (d1 == d2) && (k1 == k2). -- rewrite cfdotZl cfdotZr rmorph_sign mulrA -signr_addb cfdot_suml. +- rewrite linearZl_LR linearZr_LR /= rmorph_sign [_ *:( _ * _)]mulrA -signr_addb linear_suml /=. rewrite (bigD1 0) //= cfdot_cycTIiso !eqxx big1 => [|i nz_i]; last first. by rewrite cfdot_cycTIiso (negPf nz_i). rewrite addr0 /= andbC; case: (k1 == k2); rewrite ?mulr0 ?ltrr //=. diff --git a/theories/PFsection9.v b/theories/PFsection9.v index 49b4cbe..a3f8c8a 100644 --- a/theories/PFsection9.v +++ b/theories/PFsection9.v @@ -16,7 +16,7 @@ Require Import matrix mxalgebra mxrepresentation mxabelem vector. From odd_order Require Import BGsection1 BGsection3 BGsection7 BGsection15 BGsection16. From mathcomp -Require Import algC classfun character inertia vcharacter. +Require Import algC forms classfun character inertia vcharacter. From odd_order Require Import PFsection1 PFsection2 PFsection3 PFsection4. From odd_order @@ -52,6 +52,15 @@ Local Notation G := (TheMinSimpleOddGroup gT). Implicit Types (p q : nat) (x y z : gT). Implicit Types H K L N P Q R S T U V W : {group gT}. +Notation pairwise_orthogonal := (pairwise_orthogonal [hermitian of @cfdot _ _]). +Notation pairwise_orthogonalP := (pairwise_orthogonalP [dot of @cfdot _ _]). +Notation orthogonal := (orthogonal [hermitian of @cfdot _ _]). +Notation orthogonalP := (orthogonalP [hermitian of @cfdot _ _]). +Notation orthonormal := (orthonormal [hermitian of @cfdot _ _]). +Notation orthonormalP := (orthonormalP [dot of @cfdot _ _]). +Notation orthogonal_split := (orthogonal_split [dot of @cfdot _ _]). + + (* Peterfalvi (9.1) is covered by BGsection3.Frobenius_Wielandt_fixpoint. *) (* These assumptions correspond to Peterfalvi, Hypothesis (9.2). *) @@ -1075,7 +1084,7 @@ split=> {Part_a part_a}//. by rewrite Iirr_kerS ?joing_subl. rewrite -Dmu => /imageP[s1 Xmu_s1] /(congr1 (cfdot ('Ind 'chi_s1)))/eqP. rewrite cfnorm_Ind_irr ?gFnormal // eq_sym -cfdot_Res_l. - rewrite ResIndXmu // cfdotZl cfdot_irr -natrM mulnC. + rewrite ResIndXmu // linearZl_LR /= cfdot_irr -[_ *:_]natrM mulnC. by case: (s1 =P s) => [<- // | _] /idPn[]; apply: neq0CiG. split; first 2 [by rewrite mem_seqInd ?gFnormal ?(subsetP sXthXH0C)]. rewrite Ds cfIirrE ?irrXtheta ?cfInd1 // -Du -(index_sdprod defM) -/q. @@ -1888,7 +1897,7 @@ have [Aalpha Nalpha]: alpha \in 'CF(M, 'A(M)) /\ '[alpha] = nm_alpha. by rewrite inE in ker'H. have ->: '[alpha] = '[gamma] + 1. have /irrP[t Dt] := irrS1 _ S1psi1. - rewrite cfnormBd; first by rewrite Dt cfnorm_irr. + rewrite hnormBd; first by rewrite Dt /= cfnorm_irr. have /seqIndP[s /setDP[_ ker'H ] Dpsi1] := H0C_S1 _ S1psi1. apply: contraNeq ker'H; rewrite Dt /gamma -irr0 -irr_consttE => tHU1_0. rewrite inE -(sub_cfker_Ind_irr _ sHUM) ?gFnorm // -Dpsi1 Dt. @@ -1907,7 +1916,7 @@ have [Aalpha Nalpha]: alpha \in 'CF(M, 'A(M)) /\ '[alpha] = nm_alpha. rewrite -(restrm_quotientE _ sU1_UW1) -(cfIsom_cfun1 (restr_isom _ isomMH)). rewrite (cfIndIsom isomMH) // {nH_UW1 isomMH}cfIsom_iso. rewrite -(cfIndInd _ (joing_subl U W1)) // cfInd_cfun1 //= -/U1 -/a. - rewrite linearZ cfnormZ normr_nat /=; congr (_ * _). + rewrite linearZ dnormZ normr_nat /=; congr (_ * _). have defUW1: U ><| W1 = U <*> W1. by rewrite sdprodEY // -(setIidPl sUHU) -setIA tiHUW1 setIg1. apply: canLR (mulKf (neq0CG _)) _; rewrite -(sdprod_card defUW1) natrM -/q. @@ -1987,9 +1996,9 @@ have [Itau Ztau]: {in 'Z[irr M, 'A(M)], isometry tau, to 'Z[irr G]}. by apply: zchar_onS; apply: FTsupp_sub0. have oSgamma: {in S_ H0C', forall lam, '[gamma, lam] = 0}. move=> _ /seqIndP[s /setDP[_ ker'H ] ->]. - rewrite ['Ind _]cfun_sum_constt cfdot_sumr big1 // => t sMt. - rewrite cfdotZr [gamma]cfun_sum_constt cfdot_suml big1 ?mulr0 // => t0 gMt0. - rewrite cfdotZl cfdot_irr (negPf (contraNneq _ ker'H)) ?mulr0 // => Dt0. + rewrite ['Ind _]cfun_sum_constt linear_sumr big1 // => t sMt. + rewrite linearZr_LR /= [gamma]cfun_sum_constt linear_suml big1 ?mulr0 //= => t0 gMt0. + rewrite linearZl_LR /= cfdot_irr (negPf (contraNneq _ ker'H)) ?[_ *: _]mulr0 // => Dt0. rewrite inE (sub_cfker_constt_Ind_irr sMt) ?gFnorm // -Dt0. rewrite /gamma -irr0 in gMt0. rewrite -(sub_cfker_constt_Ind_irr gMt0) ?gFnorm ?joing_subl //. @@ -2004,8 +2013,8 @@ have o_alpha_S3: orthogonal alpha^\tau (map tau3 S3). set ca := '[_, _] in alpha_lam0; pose al0 := (-1) ^+ (ca < 0)%R *: alpha. have{alpha_lam0} al0_lam0: '[al0^\tau, tau3 lam0] > 0. have Zca: ca \in Cint by rewrite Cint_cfdot_vchar ?Ztau // Ztau3 ?mem_zchar. - by rewrite linearZ cfdotZl (canLR (signrMK _) (CintEsign Zca)) normr_gt0. - rewrite -Itau // -(cfnorm_sign (ca < 0)%R) -linearZ /= -/al0. + by rewrite linearZ linearZl_LR [_ *:_](canLR (signrMK _) (CintEsign Zca)) normr_gt0. + rewrite -Itau // -(hnorm_sign _ (ca < 0)%R) -linearZ /= -/al0. have S4_dIirrK: {in map tau3 S4, cancel (dirr_dIirr id) (@dchi _ _)}. apply: dirr_dIirrPE => _ /mapP[lam S4lam ->]. rewrite mem_filter -andbA negbK in S4lam. @@ -2023,7 +2032,7 @@ have o_alpha_S3: orthogonal alpha^\tau (map tau3 S3). by rewrite sqr_Cint_ge1 ?gtr_eqF -?dirr_consttE // Cint_Cnat ?Cnat_dirr. rewrite leC_nat subset_leq_card //; apply/subsetP=> _ /mapP[nu S4nu ->]. rewrite dirr_consttE S4_dIirrK //; congr (_ > 0): al0_lam0. - rewrite {al0}linearZ !cfdotZl /=; congr (_ * _) => {ca}; apply/eqP. + rewrite {al0}linearZ !linearZl_LR /=; congr (_ * _) => {ca}; apply/eqP. have{nu S4nu} [lam S4lam ->] := mapP S4nu. rewrite mem_filter in S4lam; have{S4lam} [_ S3lam] := andP S4lam. have Zdlam: lam0 - lam \in 'Z[S3, M^#]. @@ -2032,7 +2041,7 @@ have o_alpha_S3: orthogonal alpha^\tau (map tau3 S3). rewrite -subr_eq0 -cfdotBr -raddfB Dtau3 //. rewrite Itau // ?sS0A //; last exact: zchar_filter Zdlam. suffices{lam S3lam Zdlam} oS3a: {in S3, forall lam, '[alpha, lam] = 0}. - by rewrite cfdotBr subr_eq0 !oS3a. + by rewrite linearBr subr_eq0 /= !oS3a. move=> lam; rewrite mem_filter /= -eqS12 => /andP[S1'lam H0C'lam]. by rewrite cfdotBl oSgamma // (seqInd_ortho _ Spsi1) ?(memPn S1'lam) // subr0. have{s4gt0 gtS4alpha} /hasP[lam1 S4lam1 _]: has predT S4 by rewrite has_predT. @@ -2051,7 +2060,7 @@ pose beta := lam1 - (u %/ a)%:R *: psi1. have ZAbeta: beta \in 'Z[irr M, 'A(M)]. apply: sS0A; rewrite zcharD1E rpredB ?scaler_nat ?rpredMn ?mem_zchar //=. by rewrite !cfunE subr_eq0 psi1qa -natrM mulnCA divnK // S3qu. -have [_ _ poSS _ _] := scohS0; have [_ oSS] := pairwise_orthogonalP poSS. +have [_ _ poSS _ _] := scohS0; have [_ oSS] := pairwise_orthogonalP _ poSS. have o1S1: orthonormal S1. rewrite orthonormalE filter_pairwise_orthogonal // andbT. by apply/allP=> _ /irrS1/irrP[t ->]; rewrite /= cfnorm_irr. @@ -2059,10 +2068,10 @@ have o1S4: orthonormal S4. rewrite orthonormalE !filter_pairwise_orthogonal // andbT. apply/allP=> nu; rewrite mem_filter /= -andbA negbK. by case/andP=> /irrP[t ->]; rewrite cfnorm_irr. -have n1psi1: '[psi1] = 1 by have [_ -> //] := orthonormalP o1S1; rewrite eqxx. -have n1lam1: '[lam1] = 1 by have [_ -> //] := orthonormalP o1S4; rewrite eqxx. +have n1psi1: '[psi1] = 1 by have [_ -> //] := orthonormalP _ o1S1; rewrite eqxx. +have n1lam1: '[lam1] = 1 by have [_ -> //] := orthonormalP _ o1S4; rewrite eqxx. have oS14tau: orthogonal (map tau1 S1) (map tau3 S4). - apply/orthogonalP=> psi _ S1psi /mapP[lam /sS43 S3lam ->]. + apply/orthogonalP=> psi _ S1psi /= /mapP[lam /sS43 S3lam ->]. apply: {psi lam S3lam}orthogonalP S1psi (map_f tau3 S3lam). apply: (coherent_ortho scohS0 sS10 cohS1 sS30 cohS3) => psi /=. by rewrite mem_filter !inE eqS12 => /andP[-> _]. @@ -2077,16 +2086,16 @@ have [Gamma [S4_Gamma normGamma [b Dbeta]]]: have Z_G: G \in 'Z[map tau3 S4]. have [_ -> ->] := orthonormal_span (map_orthonormal Itau34 o1S4) S4G. rewrite big_seq rpred_sum // => xi S4xi; rewrite rpredZ_Cint ?mem_zchar //. - rewrite -(addrK G' G) -Dbeta cfdotBl (orthoPl oG'4) // subr0. + rewrite -(addrK G' G) -Dbeta cfdotBl (orthoPl _ _ _ oG'4) // subr0. rewrite Cint_cfdot_vchar ?Ztau //. by have{xi S4xi} [xi S4xi ->] := mapP S4xi; rewrite Ztau34 ?mem_zchar. have oD4: orthogonal Delta (map tau3 S4). - apply/orthoPl=> xi S4xi; rewrite -(addKr B Delta) addrC -dG' cfdotBl. - by rewrite (orthoPl oG'4) // (span_orthogonal oS14tau) ?subrr // memv_span. + apply/orthoPl=> xi S4xi; rewrite -(addKr B Delta) addrC -dG' linearBl /=. + by rewrite (orthoPl _ _ _ oG'4) // (span_orthogonal oS14tau) ?subrr // memv_span. have [_ -> dB] := orthonormal_span (map_orthonormal Itau1 o1S1) S1B. pose b := (u %/ a)%:R + '[B, tau1 psi1]. have betaS1_B: {in S1, forall psi, '[beta^\tau, tau1 psi] = '[B, tau1 psi]}. - move=> psi S1psi; rewrite Dbeta dG' !cfdotDl (orthoPl oD1) ?map_f // addr0. + move=> psi S1psi; rewrite Dbeta dG' !linearDl /= (orthoPl _ _ _ oD1) ?map_f // addr0. rewrite cfdotC (span_orthogonal oS14tau) ?rmorph0 ?add0r //. by rewrite memv_span ?map_f. have Zb: b \in Cint. @@ -2103,7 +2112,7 @@ have [Gamma [S4_Gamma normGamma [b Dbeta]]]: by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE psi1qa psi_qa subrr. rewrite -raddfB Dtau1 // Itau //; last first. by rewrite sS0A // zchar_split rpredB ?mem_zchar ?(zchar_on Z1dpsi). - rewrite cfdotC cfdotBr cfdotZr !cfdotBl 2?oSS ?(memPn S1'lam1) // subrr. + rewrite /= cfdotC linearBr linearZ /= !linearBl /= 2?oSS ?(memPn S1'lam1) // subrr. by rewrite add0r n1psi1 oSS // subr0 mulr1 rmorphN conjCK subrr scale0r. have Gge1: 1 <= '[G] ?= iff ('[G] == 1). rewrite eq_sym; apply: lerif_eq. @@ -2112,30 +2121,31 @@ have [Gamma [S4_Gamma normGamma [b Dbeta]]]: by rewrite Ztau34 ?mem_zchar. rewrite -(truncCK N_G) ler1n lt0n -eqC_nat truncCK {N_G}// cfnorm_eq0. have: '[beta^\tau, (lam1 - lam1^*%CF)^\tau] != 0. - rewrite Itau // cfdotBl cfdotZl !cfdotBr n1lam1. + rewrite Itau // linearBl linearZl_LR !linearBr /= n1lam1. rewrite (seqInd_conjC_ortho _ _ _ Slam1) ?mFT_odd // subr0. rewrite !oSS ?cfAut_seqInd -?(inv_eq (@cfConjCK _ _)) ?(memPn S1'lam1) //. by rewrite !(subr0, mulr0) oner_eq0. by have [_ _ ->] := sS10. rewrite Dbeta -Dtau3 //; apply: contraNneq => ->. - rewrite add0r raddfB cfdotBr !(orthoPl oG'4) ?map_f ?subr0 //. + rewrite add0r raddfB linearBr /= !(orthoPl _ _ _ oG'4) ?map_f ?subr0 //. move: S4lam1; rewrite ![_ \in S4]mem_filter /= !negbK /= cfAut_irr S3lam1s. by case/andP=> /andP[-> /cfAut_seqInd->]. have ubG: '[G] + (b ^+ 2 - b) * (u %/ a).*2%:R + '[Delta] = 1. apply: (addrI ((u %/ a) ^ 2)%:R); transitivity '[beta^\tau]. - rewrite -!addrA addrCA Dbeta cfnormDd; last first. + rewrite -!addrA addrCA Dbeta hnormDd /=; last first. by rewrite cfdotC (span_orthogonal oG'4) ?rmorph0 // memv_span ?inE. - congr (_ + _); rewrite !addrA dG' cfnormDd; last first. + congr (_ + _); rewrite !addrA dG' hnormDd /=; last first. by rewrite cfdotC (span_orthogonal oD1) ?rmorph0 // memv_span ?inE. - congr (_ + _); rewrite dB scaleNr [- _ + _]addrC cfnormB !cfnormZ. - rewrite normr_nat Cint_normK // scaler_sumr cfdotZr rmorph_nat. + congr (_ + _); rewrite dB scaleNr [- _ + _]addrC hnormB /= !dnormZ. + rewrite normr_nat Cint_normK // scaler_sumr linearZ /= rmorph_nat. rewrite cfnorm_map_orthonormal // cfproj_sum_orthonormal //. - rewrite Itau1 ?mem_zchar // n1psi1 mulr1 rmorphM rmorph_nat conj_Cint //. + rewrite Itau1 ?mem_zchar //= n1psi1 mulr1 rmorphM rmorph_nat conj_Cint //=. + rewrite expr0 mul1r. rewrite -mulr2n oS1ua -muln_divA // mul2n -addrA addrCA -natrX mulrBl. by congr (_ + (_ - _)); rewrite -mulrnAl -mulrnA muln2 mulrC. - rewrite Itau // cfnormBd; last first. - by rewrite cfdotZr oSS ?mulr0 // (memPnC S1'lam1). - by rewrite cfnormZ normr_nat n1psi1 n1lam1 mulr1 addrC -natrX. + rewrite Itau // hnormBd /=; last first. + by rewrite linearZ /= oSS ?mulr0 // (memPnC S1'lam1). + by rewrite dnormZ normr_nat /= n1psi1 n1lam1 mulr1 addrC -natrX. have ubDelta: '[G] <= '[G] + '[Delta] ?= iff (Delta == 0). rewrite addrC -lerif_subLR subrr -cfnorm_eq0 eq_sym. by apply: lerif_eq; apply: cfnorm_ge0. @@ -2155,12 +2165,12 @@ have [Gamma [S4_Gamma normGamma [b Dbeta]]]: by case: b01 => ->; rewrite ?eqxx ?oner_eq0. (* Final step (9.11.8). *) have alpha_beta: '[alpha^\tau, beta^\tau] = (u %/ a)%:R. - rewrite Itau // cfdotBr cfdotZr rmorph_nat !cfdotBl !oSgamma // !sub0r. + rewrite Itau // linearBr linearZ /= rmorph_nat !linearBl /= !oSgamma // !sub0r. by rewrite n1psi1 mulrN opprK mulr1 addrC oSS ?subr0 // (memPn S1'lam1). have [X S1X [Delta [Dalpha _ oD1]]]:= orthogonal_split (map tau1 S1) alpha^\tau. pose x := 1 + '[X, tau1 psi1]. have alphaS1_X: {in S1, forall psi, '[alpha^\tau, tau1 psi] = '[X, tau1 psi]}. - by move=> psi S1psi; rewrite Dalpha cfdotDl (orthoPl oD1) ?map_f // addr0. + by move=> psi S1psi; rewrite Dalpha linearDl /= (orthoPl _ _ _ oD1) ?map_f // addr0. have Zx: x \in Cint. rewrite rpredD ?rpred1 // -alphaS1_X // Cint_cfdot_vchar ?Ztau //. by rewrite Ztau1 ?mem_zchar. @@ -2176,24 +2186,25 @@ have{alphaS1_X S1X} defX: X = x *: (\sum_(psi <- S1) tau1 psi) - tau1 psi1. by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE psi1qa psi_qa subrr. rewrite -raddfB Dtau1 // Itau //; last first. by rewrite sS0A // zchar_split rpredB ?mem_zchar ?(zchar_on Z1dpsi). - rewrite cfdotBr !cfdotBl !oSgamma // n1psi1 cfdotC oSS // rmorph0. + rewrite linearBr !linearBl /= !oSgamma // n1psi1 cfdotC oSS // rmorph0. by rewrite !subr0 add0r subrr scale0r. have{x Zx X defX Delta Dalpha oD1} b_mod_ua: (b == 0 %[mod u %/ a])%C. rewrite -oppr0 -eqCmodN (eqCmod_trans _ (eqCmodm0 _)) // {2}nCdivE. - rewrite -alpha_beta Dbeta -addrA cfdotDr. + rewrite -alpha_beta Dbeta -addrA linearDr /=. rewrite (span_orthogonal o_alpha_S3) ?add0r; first 1 last. - by rewrite memv_span ?inE. - apply: subvP (zchar_span S4_Gamma); apply: sub_span; apply: mem_subseq. by rewrite map_subseq ?filter_subseq. - rewrite Dalpha addrC cfdotDl (span_orthogonal oD1); first 1 last. + rewrite Dalpha addrC linearDl /= (span_orthogonal oD1);first 1 last. - by rewrite memv_span ?inE. - rewrite addrC rpredB ?rpredZ //; last by rewrite memv_span ?map_f. by rewrite big_seq rpred_sum // => psi S1psi; rewrite memv_span ?map_f. - rewrite add0r addrC defX cfdotBr cfdotBl cfdotZl cfdotZr !scaler_sumr. - rewrite cfdotZr !rmorph_nat cfdotBl Itau1 ?mem_zchar // n1psi1. + rewrite add0r addrC defX linearBr linearBl /= linearZl_LR /=linearZr_LR /= !scaler_sumr. + rewrite linearZr_LR /= !rmorph_nat /= linearBl /= Itau1 /= ?mem_zchar //= n1psi1. rewrite cfnorm_map_orthonormal // cfdotC !cfproj_sum_orthonormal //. rewrite rmorph_nat oS1ua -muln_divA // natrM !mulrA addrC mulrC addrA. - rewrite -mulNr -mulrDl eqCmod_sym eqCmod_addl_mul // addrC !rpredB ?rpred1 //. + rewrite scalerAl [_ *: (_ * _)]mulrA. + rewrite -mulNr -mulrDl eqCmod_sym eqCmod_addl_mul // addrC !rpredB ?rpred1 //. by rewrite !rpredM ?rpred_nat. have{b_mod_ua alpha_beta} b0: b = 0%N :> nat. have:= b_mod_ua; rewrite /eqCmod subr0 dvdC_nat => /eqnP.