diff options
| author | Enrico Tassi | 2018-04-17 16:57:13 +0200 |
|---|---|---|
| committer | Enrico Tassi | 2018-04-17 16:57:13 +0200 |
| commit | eaa90cf9520e43d0b05fc6431a479e6b9559ef0e (patch) | |
| tree | 8499953a468a8d8be510dd0d60232cbd8984c1ec /mathcomp/odd_order/PFsection1.v | |
| parent | c1ec9cd8e7e50f73159613c492aad4c6c40bc3aa (diff) | |
move odd_order to its own repository
Diffstat (limited to 'mathcomp/odd_order/PFsection1.v')
| -rw-r--r-- | mathcomp/odd_order/PFsection1.v | 762 |
1 files changed, 0 insertions, 762 deletions
diff --git a/mathcomp/odd_order/PFsection1.v b/mathcomp/odd_order/PFsection1.v deleted file mode 100644 index 8e0b539..0000000 --- a/mathcomp/odd_order/PFsection1.v +++ /dev/null @@ -1,762 +0,0 @@ -(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *) -(* Distributed under the terms of CeCILL-B. *) -Require Import mathcomp.ssreflect.ssreflect. -From mathcomp -Require Import ssrbool ssrfun eqtype ssrnat seq path div choice. -From mathcomp -Require Import fintype tuple finfun bigop prime ssralg finset fingroup morphism. -From mathcomp -Require Import perm automorphism quotient action zmodp finalg center commutator. -From mathcomp -Require Import poly cyclic pgroup nilpotent matrix mxalgebra mxrepresentation. -From mathcomp -Require Import vector falgebra fieldext ssrnum algC rat algnum galois. -From mathcomp -Require Import classfun character inertia integral_char vcharacter. -From mathcomp -Require ssrint. - -(******************************************************************************) -(* This file covers Peterfalvi, Section 1: Preliminary results. *) -(******************************************************************************) - -Set Implicit Arguments. -Unset Strict Implicit. -Unset Printing Implicit Defensive. - -Import GroupScope GRing.Theory Num.Theory. -Local Open Scope ring_scope. - -Local Notation algCF := [fieldType of algC]. - -Section Main. - -Variable gT : finGroupType. - -(* This is Peterfalvi (1.1). *) -Lemma odd_eq_conj_irr1 (G : {group gT}) t : - odd #|G| -> (('chi[G]_t)^*%CF == 'chi_t) = ('chi_t == 1). -Proof. -rewrite -coprimen2 => oddG; pose A := <[1 : 'Z_2]>. -have Z2P (a : 'Z_2): a = 0 \/ a = 1 by apply/pred2P; case: a => -[|[]]. -pose Ito (t : Iirr G) := [fun a : 'Z_2 => iter a (@conjC_Iirr _ G) t]. -pose Cto (C : {set gT}) := [fun a : 'Z_2 => iter a invg C]. -have IactP: is_action A Ito. - split=> [|i /Z2P[]->] /Z2P[]-> //=; last by rewrite conjC_IirrK. - exact/inv_inj/conjC_IirrK. -have CactP: is_action A Cto. - by split=> [|C /Z2P[]->] /Z2P[]-> //=; [apply: invg_inj | rewrite invgK]. -pose Iact := Action IactP; pose Cact := Action CactP. -have n_cG_A: [acts A, on classes G | Cact]. - rewrite cycle_subG !inE cycle_id; apply/subsetP=> _ /imsetP[x Gx ->]. - by rewrite !inE /= -classVg mem_classes ?groupV. -transitivity (t \in [set 0]); last by rewrite inE irr_eq1. -suffices{t} /eqP->: [set 0] == 'Fix_Iact[1]. - by rewrite !inE sub1set inE -(inj_eq irr_inj) conjC_IirrE. -rewrite eqEcard !(sub1set, inE) conjC_Iirr_eq0 eqxx /=. -rewrite (card_afix_irr_classes (cycle_id _) n_cG_A) => [|i x xy Gx]; last first. - rewrite inE => {xy}/imsetP[y Gy /(canRL invgK)->]. - by rewrite -conjVg cfunJ {y Gy}//= conjC_IirrE cfunE -irr_inv invgK. -have ->: #|[set 0 : Iirr G]| = #|[1 {set gT}]| by rewrite !cards1. -apply/subset_leq_card/subsetP=> _ /setIdP[/imsetP[x Gx ->] /afix1P-DxGV]. -have /imsetP[y Gy DxV]: x^-1%g \in x ^: G by rewrite -DxGV memV_invg class_refl. -have{Gy} cxy: y \in 'C[x]. - suffices cxy2: (y ^+ 2)%g \in 'C[x] by rewrite -(expgK oddG Gy) groupX. - by rewrite cent1C cent1E conjgC conjgM -DxV conjVg -DxV invgK. -rewrite inE classG_eq1 -in_set1 -(expgK oddG Gx) groupX // inE. -by rewrite -eq_invg_mul DxV conjgE -(cent1P cxy) mulKg. -Qed. - -Variables G H : {group gT}. - -(* This is Peterfalvi (1.2). *) -Lemma irr_reg_off_ker_0 t g : g \in G -> - H <| G -> ~~ (H \subset cfker 'chi[G]_t) -> 'C_H[g] = 1%g -> 'chi_t g = 0. -Proof. -pose kerH i := H \subset cfker 'chi[G]_i => Gg nsHG kerH't regHg; apply/eqP. -pose sum_norm2 x := \sum_i `|'chi_i x| ^+ 2. -have norm2_ge0 a: 0 <= `|a| ^+ 2 :> algC by rewrite exprn_ge0 ?normr_ge0. -have{regHg}: sum_norm2 gT G g <= sum_norm2 _ (G / H)%G (coset H g). - rewrite ). - rewrite !second_orthogonality_relation ?mem_quotient // !class_refl ler_nat. - suffices /card_isog->: 'C_G[g] \isog 'C_G[g] / H. - exact/subset_leq_card/quotient_subcent1. - by apply/quotient_isog; rewrite ?subIset 1?normal_norm // setICA regHg setIg1. -rewrite /sum_norm2 (bigID kerH) ?sum_norm_irr_quo //= -ler_subr_addl subrr. -rewrite ler_eqVlt psumr_eq0 ?ler_gtF ?sumr_ge0 // orbF => /allP/(_ t)/implyP. -by rewrite mem_index_enum kerH't expf_eq0 normr_eq0. -Qed. - -(* This is Peterfalvi (1.3)(a). *) -Lemma equiv_restrict_compl A m (Phi : m.-tuple 'CF(H)) (mu : 'CF(G)) d : - H \subset G -> A <| H -> basis_of 'CF(H, A) Phi -> - ({in A, mu =1 \sum_i d i *: 'chi_i} <-> - (forall j : 'I_m, - \sum_i '[Phi`_j, 'chi_i] * (d i)^* = '['Ind[G] Phi`_j, mu])). -Proof. -move=> sHG nsAH BPhi; have [sAH nAH] := andP nsAH. -have APhi (i : 'I_m) : Phi`_i \in 'CF(H, A). - by apply: (basis_mem BPhi _); apply: mem_nth; rewrite size_tuple. -pose D := 'Res[H] mu - \sum_i d i *: 'chi_i. -transitivity (D \in 'CF(H, H :\: A)). - split=> [A'D | /cfun_onP A'D x Ax]. - apply/cfun_onP=> x; rewrite inE negb_and negbK. - case/orP=> [Ax | /cfun0-> //]; rewrite !cfunE -A'D //. - by rewrite cfResE ?subrr ?(subsetP sAH). - have:= A'D x; rewrite !cfunE !inE Ax => /(_ isT)/(canRL (subrK _)). - by rewrite add0r cfResE // ?(subsetP sAH). -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. -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. - by have/eqP := HH j; rewrite F0 => /eqP. -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 raddfD /= {1}(cfdot_complement Cf Cg) addr0 => /eqP. -by rewrite cfnorm_eq0 defD => /eqP->; rewrite add0r. -Qed. - -(* This is Peterfalvi (1.3)(b). *) -Lemma equiv_restrict_compl_ortho A m (Phi : m.-tuple 'CF(H)) mu_ : - H \subset G -> A <| H -> basis_of 'CF(H, A) Phi -> - (forall i j, '[mu_ i, mu_ j] = (i == j)%:R) -> - (forall j : 'I_m, 'Ind[G] Phi`_j = \sum_i '[Phi`_j, 'chi_i] *: mu_ i) -> - [/\ forall i, {in A, mu_ i =1 'chi_i} - & forall mu, (forall i, '[mu, mu_ i] = 0) -> {in A, forall x, mu x = 0}]. -Proof. -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. -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. -Qed. - -Let vchar_isometry_base3 f f' : - f \in 'Z[irr G, G^#] -> '[f]_G = 2%:R -> - f' \in 'Z[irr G, G^#] -> '[f']_G = 2%:R -> - '[f, f'] = 1 -> - exists es : _ * bool, let: (i, j, k, epsilon) := es in - [/\ f = (-1) ^+ epsilon *: ('chi_j - 'chi_i), - f' = (-1) ^+ epsilon *: ('chi_j - 'chi_k) - & uniq [:: i; j; k]]. -Proof. -move=> Hf H2f Hf1 H2f1. -have [j [i neq_ij ->]] := vchar_norm2 Hf H2f. -have [j' [k neq_kj' ->]] := vchar_norm2 Hf1 H2f1. -rewrite cfdotBl !cfdotBr !cfdot_irr opprB addrAC !addrA. -do 2!move/(canRL (subrK _)); rewrite -(natrD _ 1) -!natrD => /eqP. -rewrite eqr_nat; have [eq_jj' | neq_jj'] := altP (j =P j'). - rewrite (eq_sym j) -eq_jj' {1}eq_jj' (negbTE neq_ij) (negbTE neq_kj'). - rewrite eqSS (can_eq oddb) => /eqP neq_ik; exists (i, j, k, false). - by rewrite !scaler_sign /= !inE neq_ik orbF neq_ij eq_sym eq_jj' neq_kj'. -case: (i =P k) => // eq_ik; exists (j, i, j', true). -rewrite !scaler_sign !opprB /= !inE eq_sym negb_or neq_ij neq_jj'. -by rewrite eq_ik neq_kj'. -Qed. - -Let vchar_isometry_base4 (eps : bool) i j k n m : - let f1 := 'chi_j - 'chi_i in - let f2 := 'chi_k - 'chi_i in - let f3 := 'chi_n - 'chi_m in - j != k -> '[f3, f1]_G = (-1) ^+ eps -> '[f3, f2] = (-1) ^+ eps -> - if eps then n == i else m == i. -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. -rewrite !cfdotBl !cfdotBr !cfdot_irr !opprB addrAC addrA. -do 2!move/(canRL (subrK _)); rewrite -(natrD _ 1) -!natrD. -move/(can_inj natCK); case: (m == i) => //. -case: eqP => // ->; case: (j == i) => // _. -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)}) : - (1 < m)%N -> {subset Chi <= irr H} -> free Chi -> - (forall chi, chi \in Chi -> chi 1%g = Chi`_0 1%g) -> - (forall i : 'I_m, (Chi`_i - Chi`_0) \in 'CF(H, L)) -> - {in 'Z[Chi, L], isometry tau, to 'Z[irr G, G^#]} -> - exists2 mu : m.-tuple (Iirr G), - uniq mu - & exists epsilon : bool, forall i : 'I_m, - tau (Chi`_i - Chi`_0) = (-1) ^+ epsilon *: ('chi_(mu`_i) - 'chi_(mu`_0)). -Proof. -case: m Chi => [|[|m]] // Chi _ irrChi Chifree Chi1 ChiCF [iso_tau Ztau]. -rewrite -(tnth_nth 0 _ 0); set chi := tnth Chi. -have chiE i: chi i = Chi`_i by rewrite -tnth_nth. -have inChi i: chi i \in Chi by apply: mem_tnth. -have{irrChi} irrChi i: chi i \in irr H by apply: irrChi. -have eq_chi i j: (chi i == chi j) = (i == j). - by rewrite /chi !(tnth_nth 0) nth_uniq ?size_tuple ?free_uniq. -have dot_chi i j: '[chi i, chi j] = (i == j)%:R. - rewrite -eq_chi; have [/irrP[{i}i ->] /irrP[{j}j ->]] := (irrChi i,irrChi j). - by rewrite cfdot_irr inj_eq //; apply: irr_inj. -pose F i j := chi i - chi j. -have DF i j : F i j = F i 0 - F j 0 by rewrite /F opprB addrA subrK. -have ZF i j: F i j \in 'Z[Chi, L]. - 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->. - 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). - 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). - case/(vchar_norm2 (Ztau _ (ZF 1 0))) => [k1 [k0 neq_k01 eq_mu]]. - pose mu := @Tuple _ _ [:: k0; k1] m0. - exists mu; first by rewrite /= andbT inE. - exists false => i; rewrite scale1r chiE. - have: (i : nat) \in iota 0 2 by rewrite mem_iota (eqP m0) (valP i). - rewrite !inE; case/pred2P=> ->; first by rewrite !subrr linear0. - by rewrite -eq_mu /F !chiE. -have m_gt2: (2 < m.+2)%N by rewrite !ltnS lt0n. -pose i2 := Ordinal m_gt2. -case: (@vchar_isometry_base3 (tau (F 1 0)) (tau (F i2 0))); auto. -case=> [[[k1 k0] k2] e] []; set d := (-1) ^+ e => eq10 eq20. -rewrite /= !inE => /and3P[/norP[nek10 nek12]]; rewrite eq_sym => nek20 _. -have muP i: - {k | (i == 0) ==> (k == k0) & tau (F i 0) == d *: ('chi_k0 - 'chi_k)}. -- apply: sig2W; have [-> | nei0] := altP (i =P 0). - by exists k0; rewrite ?eqxx // /F !subrr !linear0. - have /(vchar_norm2 (Ztau _ (ZF i 0)))[k [k' nekk' eqFkk']] := htau2 i 0 nei0. - have [-> | neq_i1] := eqVneq i 1; first by exists k1; rewrite // -eq10. - 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 -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. -pose mu := [tuple of [seq s2val (muP i) | i <- ord_tuple m.+2]]; exists mu. - rewrite map_inj_uniq ?enum_uniq // => i j. - case: (muP i) (muP j) => /= ki _ /eqP eq_i0 [/= kj _ /eqP eq_j0] eq_kij. - apply/eqP; rewrite -eq_chi -subr_eq0 -cfnorm_eq0 -iso_tau ?ZF //. - rewrite -[chi i](subrK (chi 0)) -addrA linearD eq_i0 eq_kij -eq_j0. - by rewrite -linearD -opprB subrr !raddf0. -exists (~~ e) => i; rewrite -addbT signr_addb -/d -scalerA scaleN1r opprB. -rewrite -!tnth_nth -/(F i 0) tnth_map tnth_ord_tuple. -suffices /= ->: mu`_0 = k0 by case: (muP i) => /= k _ /eqP. -rewrite -(tnth_nth 0 _ 0) tnth_map tnth_ord_tuple. -by case: (muP 0) => /= k /(k =P k0). -Qed. - -(* This is Peterfalvi (1.5)(a). *) -Lemma cfResInd_sum_cfclass t : H <| G -> - 'Res[H] ('Ind[G] 'chi_t) - = #|'I_G['chi_t] : H|%:R *: \sum_(xi <- ('chi_t ^: G)%CF) xi. -Proof. -set T := 'I_G['chi_t] => nsHG; have [sHG nHG] := andP nsHG. -apply/cfun_inP=> h Hh; rewrite cfResE ?cfIndE // cfunE sum_cfunE. -apply: (canLR (mulKf (neq0CG H))). -rewrite mulrA -natrM Lagrange ?sub_Inertia //= -/T reindex_cfclass //=. -rewrite mulr_sumr [s in _ = s]big_mkcond /= (reindex_inj invg_inj). -rewrite (partition_big (conjg_Iirr t) xpredT) //=; apply: eq_bigr => i _. -have [[y Gy chi_i] | not_i_t] := cfclassP _ _ _; last first. - apply: big1 => z; rewrite groupV => /andP[Gz /eqP def_i]. - by case: not_i_t; exists z; rewrite // -def_i conjg_IirrE. -rewrite -(card_rcoset _ y) mulr_natl -sumr_const; apply: eq_big => z. - rewrite -(inj_eq irr_inj) conjg_IirrE chi_i mem_rcoset inE groupMr ?groupV //. - apply: andb_id2l => Gz; rewrite eq_sym (cfConjg_eqE _ nsHG) //. - by rewrite mem_rcoset inE groupM ?groupV. -rewrite groupV => /andP[Gz /eqP <-]. -by rewrite conjg_IirrE cfConjgE ?(subsetP nHG). -Qed. - -(* This is Peterfalvi (1.5)(b), main formula. *) -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 big1 ?addr0 ?mulr1 // => j /andP[_ /negbTE]. -by rewrite eq_sym cfdot_irr => ->. -Qed. - -(* This is Peterfalvi (1.5)(b), irreducibility remark. *) -Lemma inertia_Ind_irr t : - H <| G -> 'I_G['chi[H]_t] \subset H -> 'Ind[G] 'chi_t \in irr G. -Proof. -rewrite -indexg_eq1 => nsHG /eqP r1. -by rewrite irrEchar cfInd_char ?irr_char //= cfnorm_Ind_irr ?r1. -Qed. - -(* This is Peterfalvi (1.5)(c). *) -Lemma cfclass_Ind_cases t1 t2 : H <| G -> - if 'chi_t2 \in ('chi[H]_t1 ^: G)%CF - then 'Ind[G] 'chi_t1 = 'Ind[G] 'chi_t2 - 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. -case: eqP => // <- /idPn[]; apply: contra not_ch1Gt2 => /cfclassP[y Gy ->]. -by apply/cfclassP; exists y^-1%g; rewrite ?groupV ?cfConjgK. -Qed. - -(* Useful consequences of (1.5)(c) *) -Lemma not_cfclass_Ind_ortho i j : - H <| G -> ('chi_i \notin 'chi_j ^: G)%CF -> - '['Ind[G, H] 'chi_i, 'Ind[G, H] 'chi_j] = 0. -Proof. by move/(cfclass_Ind_cases i j); rewrite cfclass_sym; case: ifP. Qed. - -Lemma cfclass_Ind_irrP i j : - H <| G -> - reflect ('Ind[G, H] 'chi_i = 'Ind[G, H] 'chi_j) ('chi_i \in 'chi_j ^: G)%CF. -Proof. -move=> nsHG; have [sHG _] := andP nsHG. -case: ifP (cfclass_Ind_cases j i nsHG) => [|_ Oji]; first by left. -right=> eq_chijG; have /negP[]: 'Ind[G] 'chi_i != 0 by apply: Ind_irr_neq0. -by rewrite -cfnorm_eq0 {1}eq_chijG Oji. -Qed. - -Lemma card_imset_Ind_irr (calX : {set Iirr H}) : - H <| G -> {in calX, forall i, 'Ind 'chi_i \in irr G} -> - {in calX & G, forall i y, conjg_Iirr i y \in calX} -> - #|calX| = (#|G : H| * #|[set cfIirr ('Ind[G] 'chi_i) | i in calX]|)%N. -Proof. -move=> nsHG irrIndX sXGX; have [sHG _] := andP nsHG; set f := fun i => cfIirr _. -rewrite -sum1_card (partition_big_imset f) /= mulnC -sum_nat_const. -apply: eq_bigr => _ /imsetP[i Xi ->]; transitivity (size (cfclass 'chi_i G)). - rewrite -sum1_size reindex_cfclass //; apply: eq_bigl => j. - case Xj: (j \in calX). - rewrite -(inj_eq irr_inj) !(cfIirrPE irrIndX) //. - exact/eqP/cfclass_Ind_irrP. - apply/esym/(contraFF _ Xj)=> /cfclassP[y Gy Dj]. - by rewrite -conjg_IirrE in Dj; rewrite (irr_inj Dj) sXGX. -rewrite -(Lagrange_index (Inertia_sub G 'chi_i)) ?sub_Inertia //. -rewrite -size_cfclass ((#|_ : _| =P 1)%N _) ?muln1 // -eqC_nat. -by rewrite -cfnorm_Ind_irr // -(cfIirrPE irrIndX) ?cfnorm_irr. -Qed. - -(* This is Peterfalvi (1.5)(d). *) -Lemma scaled_cfResInd_sum_cfclass t : H <| G -> - let chiG := 'Ind[G] 'chi_t in - (chiG 1%g / '[chiG]) *: 'Res[H] chiG - = #|G : H|%:R *: (\sum_(xi <- ('chi_t ^: G)%CF) xi 1%g *: xi). -Proof. -move=> nsHG chiG; have [sHG _] := andP nsHG. -rewrite cfResInd_sum_cfclass // cfnorm_Ind_irr // scalerA cfInd1 //. -rewrite divfK ?pnatr_eq0 -?lt0n // -scalerA linear_sum !reindex_cfclass //=. -congr (_ *: _); apply: eq_bigr => _ /cfclassP[y _ ->]. -by rewrite cfConjg1. -Qed. - -(* This is Peterfalvi (1.5)(e). *) -Lemma odd_induced_orthogonal t : - H <| G -> odd #|G| -> t != 0 -> - '['Ind[G, H] 'chi_t, ('Ind[G] 'chi_t)^*] = 0. -Proof. -move=> nsHG oddG nz_t; have [sHG _] := andP nsHG. -have:= cfclass_Ind_cases t (conjC_Iirr t) nsHG. -rewrite conjC_IirrE conj_cfInd; case: cfclassP => // [[g Gg id_cht]]. -have oddH: odd #|H| := pgroup.oddSg sHG oddG. -case/eqP: nz_t; apply: irr_inj; rewrite irr0. -apply/eqP; rewrite -odd_eq_conj_irr1 // id_cht; apply/eqP. -have F1: ('chi_t ^ (g ^+ 2))%CF = 'chi_t. - rewrite (cfConjgM _ nsHG) // -id_cht -conj_cfConjg -id_cht. - exact: cfConjCK. -suffices /eqP->: g == ((g ^+ 2) ^+ #|G|./2.+1)%g. - elim: _./2.+1 => [|n IHn]; first exact: cfConjgJ1. - by rewrite expgS (cfConjgM _ nsHG) ?groupX // F1. -rewrite eq_mulVg1 expgS -expgM mul2n -mulgA mulKg -expgS -order_dvdn. -by rewrite -add1n -[1%N](congr1 nat_of_bool oddG) odd_double_half order_dvdG. -Qed. - -(* This is Peterfalvi (1.6)(a). *) -Lemma sub_cfker_Ind_irr A i : - H \subset G -> G \subset 'N(A) -> - (A \subset cfker ('Ind[G, H] 'chi_i)) = (A \subset cfker 'chi_i). -Proof. by move=> sHG nAG; rewrite cfker_Ind_irr ?sub_gcore. Qed. - -(* Some consequences and related results. *) -Lemma sub_cfker_Ind (A : {set gT}) chi : - A \subset H -> H \subset G -> G \subset 'N(A) -> chi \is a character -> - (A \subset cfker ('Ind[G, H] chi)) = (A \subset cfker chi). -Proof. -move=> sAH sHG nAG Nchi; have [-> | nz_chi] := eqVneq chi 0. - by rewrite raddf0 !cfker_cfun0 !(subset_trans sAH). -by rewrite cfker_Ind ?sub_gcore. -Qed. - -Lemma cfInd_irr_eq1 i : - H <| G -> ('Ind[G, H] 'chi_i == 'Ind[G, H] 1) = (i == 0). -Proof. -case/andP=> sHG nHG; apply/eqP/idP=> [chi1 | /eqP->]; last by rewrite irr0. -rewrite -subGcfker -(sub_cfker_Ind_irr _ sHG nHG) chi1 -irr0. -by rewrite sub_cfker_Ind_irr ?cfker_irr0. -Qed. - -Lemma sub_cfker_constt_Res_irr (A : {set gT}) i j : - j \in irr_constt ('Res[H, G] 'chi_i) -> - A \subset H -> H \subset G -> G \subset 'N(A) -> - (A \subset cfker 'chi_j) = (A \subset cfker 'chi_i). -Proof. -move=> iHj sAH sHG nAG; apply/idP/idP=> kerA. - have jGi: i \in irr_constt ('Ind 'chi_j) by rewrite constt_Ind_Res. - rewrite (subset_trans _ (cfker_constt _ jGi)) ?cfInd_char ?irr_char //=. - by rewrite sub_cfker_Ind_irr. -rewrite (subset_trans _ (cfker_constt _ iHj)) ?cfRes_char ?irr_char //=. -by rewrite cfker_Res ?irr_char // subsetI sAH. -Qed. - -Lemma sub_cfker_constt_Ind_irr (A : {set gT}) i j : - i \in irr_constt ('Ind[G, H] 'chi_j) -> - A \subset H -> H \subset G -> G \subset 'N(A) -> - (A \subset cfker 'chi_j) = (A \subset cfker 'chi_i). -Proof. by rewrite constt_Ind_Res; apply: sub_cfker_constt_Res_irr. Qed. - -(* This is a stronger version of Peterfalvi (1.6)(b). *) -Lemma cfIndMod (K : {group gT}) (phi : 'CF(H / K)) : - K \subset H -> H \subset G -> K <| G -> - 'Ind[G] (phi %% K)%CF = ('Ind[G / K] phi %% K)%CF. -Proof. by move=> sKH sHG /andP[_ nKG]; rewrite cfIndMorph ?ker_coset. Qed. - -Lemma cfIndQuo (K : {group gT}) (phi : 'CF(H)) : - K \subset cfker phi -> H \subset G -> K <| G -> - 'Ind[G / K] (phi / K)%CF = ('Ind[G] phi / K)%CF. -Proof. -move=> kerK sHG nsKG; have sKH := subset_trans kerK (cfker_sub phi). -have nsKH := normalS sKH sHG nsKG. -by apply: canRL (cfModK nsKG) _; rewrite -cfIndMod // cfQuoK. -Qed. - -Section IndSumInertia. - -Variable s : Iirr H. - -Let theta := 'chi_s. -Let T := 'I_G[theta]. -Let calA := irr_constt ('Ind[T] theta). -Let calB := irr_constt ('Ind[G] theta). -Let AtoB (t : Iirr T) := Ind_Iirr G t. -Let e_ t := '['Ind theta, 'chi[T]_t]. - -Hypothesis nsHG: H <| G. -(* begin hide *) -Let sHG : H \subset G. Proof. exact: normal_sub. Qed. -Let nHG : G \subset 'N(H). Proof. exact: normal_norm. Qed. -Let nsHT : H <| T. Proof. exact: normal_Inertia. Qed. -Let sHT : H \subset T. Proof. exact: normal_sub. Qed. -Let nHT : T \subset 'N(H). Proof. exact: normal_norm. Qed. -Let sTG : T \subset G. Proof. exact: subsetIl. Qed. -(* end hide *) - -(* This is Peterfalvi (1.7)(a). *) -Lemma cfInd_sum_Inertia : - [/\ {in calA, forall t, 'Ind 'chi_t \in irr G}, - {in calA, forall t, 'chi_(AtoB t) = 'Ind 'chi_t}, - {in calA &, injective AtoB}, - AtoB @: calA =i calB - & 'Ind[G] theta = \sum_(t in calA) e_ t *: 'Ind 'chi_t]. -Proof. -have [AtoBirr AtoBinj defB _ _] := constt_Inertia_bijection s nsHG. -split=> // [i Ai|]; first exact/cfIirrE/AtoBirr. -rewrite -(cfIndInd _ sTG sHT) {1}['Ind theta]cfun_sum_constt linear_sum. -by apply: eq_bigr => i _; rewrite linearZ. -Qed. - -Hypothesis abTbar : abelian (T / H). - -(* This is Peterfalvi (1.7)(b). *) -Lemma cfInd_central_Inertia : - exists2 e, [/\ e \in Cnat, e != 0 & {in calA, forall t, e_ t = e}] - & [/\ 'Ind[G] theta = e *: \sum_(j in calB) 'chi_j, - #|calB|%:R = #|T : H|%:R / e ^+ 2 - & {in calB, forall i, 'chi_i 1%g = #|G : T|%:R * e * theta 1%g}]. -Proof. -have [t1 At1] := constt_cfInd_irr s sHT; pose psi1 := 'chi_t1. -pose e := '['Ind theta, psi1]. -have NthT: 'Ind[T] theta \is a character by rewrite cfInd_char ?irr_char. -have Ne: e \in Cnat by rewrite Cnat_cfdot_char_irr. -have Dpsi1H: 'Res[H] psi1 = e *: theta. - have psi1Hs: s \in irr_constt ('Res psi1) by rewrite -constt_Ind_Res. - rewrite (Clifford_Res_sum_cfclass nsHT psi1Hs) cfclass_invariant ?subsetIr //. - by rewrite big_seq1 cfdot_Res_l cfdotC conj_Cnat. -have linL j: 'chi[T / H]_j \is a linear_char by apply/char_abelianP. -have linLH j: ('chi_j %% H)%CF \is a linear_char := cfMod_lin_char (linL j). -pose LtoT (j : Iirr (T / H)) := mul_mod_Iirr t1 j. -have LtoTE j: 'chi_(LtoT j) = ('chi_j %% H)%CF * psi1. - by rewrite !(mod_IirrE, cfIirrE) // mul_lin_irr ?mem_irr ?cfMod_lin_char. -have psiHG: 'Ind ('Res[H] psi1) = \sum_j 'chi_(LtoT j). - transitivity ((cfReg (T / H) %% H)%CF * psi1); last first. - rewrite cfReg_sum linear_sum /= mulr_suml; apply: eq_bigr => i _. - by rewrite LtoTE // lin_char1 ?scale1r. - apply/cfun_inP=> x Tx; rewrite cfunE cfModE // cfRegE mulrnAl mulrb. - rewrite (sameP eqP (kerP _ (subsetP nHT x Tx))) ker_coset. - case: ifPn => [Hx | H'x]; last by rewrite (cfun_on0 (cfInd_normal _ _)). - rewrite card_quotient // -!(cfResE _ sHT) // cfRes_Ind_invariant ?cfunE //. - by rewrite -subsetIidl (subset_trans _ (sub_inertia_Res _ _)) ?sub_Inertia. -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. - apply: contraR; rewrite negb_exists => /forallP imL't. - by rewrite psiHG cfdot_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. -have{imLtoT} A_1 t: t \in calA -> 'chi_t 1%g = e * theta 1%g. - case/imLtoT/codomP=> j ->; rewrite LtoTE //= cfunE. - by rewrite (lin_char1 (linLH j)) mul1r -(cfRes1 H) Dpsi1H cfunE. -exists e => //; have [_ defAtoB injAtoB imAtoB ->] := cfInd_sum_Inertia. -rewrite -(eq_bigl _ _ imAtoB) -(eq_card imAtoB) big_imset //= scaler_sumr. -split=> [||i]; first by apply: eq_bigr => t2 At2; rewrite De_ ?defAtoB. - apply: (mulIf (irr1_neq0 s)); rewrite mulrAC -cfInd1 // mulr_natl mulrC invfM. - rewrite ['Ind _]cfun_sum_constt sum_cfunE mulr_sumr card_in_imset //. - rewrite -sumr_const; apply: eq_bigr => t At. - by rewrite -mulrA -/(e_ t) De_ // cfunE A_1 ?mulKf. -by rewrite -imAtoB => /imsetP[t At ->]; rewrite defAtoB ?cfInd1 ?A_1 ?mulrA. -Qed. - -(* This is Peterfalvi (1.7)(c). *) -Lemma cfInd_Hall_central_Inertia : - Hall T H -> - [/\ 'Ind[G] theta = \sum_(i in calB) 'chi_i, #|calB| = #|T : H| - & {in calB, forall i, 'chi_i 1%g = #|G : T|%:R * theta 1%g}]. -Proof. -case/andP=> _ hallH; have [e [_ _ De]] := cfInd_central_Inertia. -suffices ->: e = 1. - by case=> -> /eqP; rewrite scale1r expr1n divr1 mulr1 eqC_nat => /eqP. -suffices{De} [t Dtheta]: exists i, 'Res[H, T] 'chi_i = theta. - have e_t_1: e_ t = 1 by rewrite /e_ -cfdot_Res_r Dtheta cfnorm_irr. - by rewrite -(De t) // irr_consttE -/(e_ t) e_t_1 oner_eq0. -have ITtheta: T \subset 'I[theta] := subsetIr _ _. -have solT: solvable (T / H) := abelian_sol abTbar. -have [|t []] := extend_solvable_coprime_irr nsHT solT ITtheta; last by exists t. -rewrite coprime_sym coprime_mull !(coprime_dvdl _ hallH) ?cfDet_order_dvdG //. -by rewrite -dvdC_nat !CdivE truncCK ?Cnat_irr1 // dvd_irr1_cardG. -Qed. - -End IndSumInertia. - -(* This is Peterfalvi (1.8). *) -Lemma irr1_bound_quo (B C D : {group gT}) i : - B <| C -> B \subset cfker 'chi[G]_i -> - B \subset D -> D \subset C -> C \subset G -> (D / B \subset 'Z(C / B))%g -> - 'chi_i 1%g <= #|G : C|%:R * sqrtC #|C : D|%:R. -Proof. -move=> BnC BsK BsD DsC CsG QsZ. -case: (boolP ('Res[C] 'chi_i == 0))=> [HH|]. - have: ('Res[C] 'chi_i) 1%g = 0 by rewrite (eqP HH) cfunE. - by rewrite cfResE // => HH1; case/eqP: (irr1_neq0 i). -have IC := cfRes_char C (irr_char i). -case/neq0_has_constt=> i1 Hi1. -have CIr: i \in irr_constt ('Ind[G] 'chi_i1). - by rewrite inE /= -Frobenius_reciprocity /= cfdotC conjC_eq0. -have BsKi : B \subset cfker 'chi_i1. - suff BsKri: B \subset cfker ('Res[C] 'chi_i). - by apply: (subset_trans BsKri); apply: (cfker_constt _ Hi1). - apply/subsetP=> g GiG. - have F: g \in C by rewrite (subsetP (subset_trans BsD _)). - rewrite cfkerEchar // inE F !cfResE //. - by move: (subsetP BsK _ GiG); rewrite cfkerEirr inE. -pose i2 := quo_Iirr B i1. -have ZsC: 'Z(C / B)%g \subset 'Z('chi_i2)%CF. - by rewrite -(cap_cfcenter_irr (C / B)); apply: bigcap_inf. -have CBsH: C :&: B \subset D. - apply/subsetP=> g; rewrite inE; case/andP=> _ HH. - by apply: (subsetP (BsD)). -have I1B: 'chi_i1 1%g ^+ 2 <= #|C : D|%:R. - case: (irr1_bound i2)=> HH _; move: HH. - have ->: 'chi_i2 1%g = 'chi_i1 1%g. - by rewrite quo_IirrE // -(coset_id (group1 B)) cfQuoE. - move/ler_trans; apply. - rewrite ler_nat // -(index_quotient_eq CBsH) ?normal_norm //. - rewrite -(@leq_pmul2l #|'Z('chi_i2)%CF|) ?cardG_gt0 ?cfcenter_sub //. - rewrite Lagrange ?quotientS ?cfcenter_sub //. - rewrite -(@leq_pmul2l #|(D / B)%g|) ?cardG_gt0 //. - rewrite mulnA mulnAC Lagrange ?quotientS //. - rewrite mulnC leq_pmul2l ?cardG_gt0 // subset_leq_card //. - exact: subset_trans QsZ ZsC. -have IC': 'Ind[G] 'chi_i1 \is a character := cfInd_char G (irr_char i1). -move: (char1_ge_constt IC' CIr); rewrite cfInd1 //= => /ler_trans-> //. -have chi1_1_ge0: 0 <= 'chi_i1 1%g by rewrite ltrW ?irr1_gt0. -rewrite ler_pmul2l ?gt0CiG //. -by rewrite -(@ler_pexpn2r _ 2) -?topredE /= ?sqrtC_ge0 ?ler0n ?sqrtCK. -Qed. - -(* This is Peterfalvi (1.9)(a). *) -Lemma extend_coprime_Qn_aut a b (Qa Qb : fieldExtType rat) w_a w_b - (QaC : {rmorphism Qa -> algC}) (QbC : {rmorphism Qb -> algC}) - (mu : {rmorphism algC -> algC}) : - coprime a b -> - a.-primitive_root w_a /\ <<1; w_a>>%VS = {:Qa}%VS -> - b.-primitive_root w_b /\ <<1; w_b>>%VS = {:Qb}%VS -> - {nu : {rmorphism algC -> algC} | forall x, nu (QaC x) = mu (QaC x) - & forall y, nu (QbC y) = QbC y}. -Proof. -move=> coab [pr_w_a genQa] [pr_w_b genQb]. -have [k co_k_a Dmu]: {k | coprime k a & mu (QaC w_a) = QaC (w_a ^+ k)}. - have prCw: a.-primitive_root (QaC w_a) by rewrite fmorph_primitive_root. - by have [k coka ->] := aut_prim_rootP mu prCw; rewrite -rmorphX; exists k. -pose k1 := chinese a b k 1; have /Qn_aut_exists[nu Dnu]: coprime k1 (a * b). - rewrite coprime_mulr -!(coprime_modl k1) chinese_modl ?chinese_modr //. - by rewrite !coprime_modl co_k_a coprime1n. -exists nu => [x | y]. - have /Fadjoin_polyP[p Qp ->]: x \in <<1; w_a>>%VS by rewrite genQa memvf. - rewrite -!horner_map -!map_poly_comp !map_Qnum_poly // Dmu Dnu -rmorphX /=. - by rewrite -(prim_expr_mod pr_w_a) chinese_modl // prim_expr_mod. - by rewrite exprM (prim_expr_order pr_w_a) expr1n rmorph1. -have /Fadjoin_polyP[p Qp ->]: y \in <<1; w_b>>%VS by rewrite genQb memvf. -rewrite -!horner_map -!map_poly_comp !map_Qnum_poly // Dnu -rmorphX /=. - by rewrite -(prim_expr_mod pr_w_b) chinese_modr // prim_expr_mod. -by rewrite mulnC exprM (prim_expr_order pr_w_b) expr1n rmorph1. -Qed. - -(* This intermediate result in the proof of Peterfalvi (1.9)(b) is used in *) -(* he proof of (3.9)(c). *) -Lemma dvd_restrict_cfAut a (v : {rmorphism algC -> algC}) : - exists2 u : {rmorphism algC -> algC}, - forall gT0 G0 chi x, - chi \in 'Z[irr (@gval gT0 G0)] -> #[x] %| a -> u (chi x) = v (chi x) - & forall chi x, chi \in 'Z[irr G] -> coprime #[x] a -> u (chi x) = chi x. -Proof. -have [-> | a_gt0] := posnP a. - exists v => // chi x Zchi; rewrite /coprime gcdn0 order_eq1 => /eqP->. - by rewrite aut_Cint ?Cint_vchar1. -pose b := (#|G|`_(\pi(a)^'))%N. -have co_a_b: coprime a b := pnat_coprime (pnat_pi a_gt0) (part_pnat _ _). -have [Qa _ [QaC _ [w_a genQa memQa]]] := group_num_field_exists [group of Zp a]. -have [Qb _ [QbC _ [w_b genQb memQb]]] := group_num_field_exists [group of Zp b]. -rewrite !card_Zp ?part_gt0 // in Qa QaC w_a genQa memQa Qb QbC w_b genQb memQb. -have [nu nuQa nuQb] := extend_coprime_Qn_aut QaC QbC v co_a_b genQa genQb. -exists nu => [gt0 G0 chi x Zchi x_dv_a | chi x Zchi co_x_a]. - without loss{Zchi} Nchi: chi / chi \is a character. - move=> IH; case/vcharP: Zchi => [chi1 Nchi1 [chi2 Nchi2 ->]]. - by rewrite !cfunE !rmorphB !IH. - by have [xa <-] := memQa _ _ _ Nchi x x_dv_a; rewrite nuQa. -without loss{Zchi} Nchi: chi / chi \is a character. - move=> IH; case/vcharP: Zchi => [chi1 Nchi1 [chi2 Nchi2 ->]]. - by rewrite !cfunE rmorphB !IH. -have [Gx | /cfun0->] := boolP (x \in G); last by rewrite rmorph0. -have{Gx} x_dv_b: (#[x] %| b)%N. - rewrite coprime_sym coprime_pi' // in co_x_a. - by rewrite -(part_pnat_id co_x_a) partn_dvd ?order_dvdG. -by have [xb <-] := memQb _ _ _ Nchi x x_dv_b; rewrite nuQb. -Qed. - -(* This is Peterfalvi (1.9)(b). *) -(* We have strengthened the statement of this lemma so that it can be used *) -(* rather than reproved for Peterfalvi (3.9). In particular we corrected a *) -(* quantifier inversion in the original statement: the automorphism is *) -(* constructed uniformly for all (virtual) characters. We have also removed *) -(* the spurrious condition that a be a \pi(a) part of #|G| -- the proof works *) -(* for all a, and indeed the first part holds uniformaly for all groups! *) -Lemma make_pi_cfAut a k : - coprime k a -> - exists2 u : {rmorphism algC -> algC}, - forall (gT0 : finGroupType) (G0 : {group gT0}) chi x, - chi \in 'Z[irr G0] -> #[x] %| a -> cfAut u chi x = chi (x ^+ k)%g - & forall chi x, chi \in 'Z[irr G] -> coprime #[x] a -> cfAut u chi x = chi x. -Proof. -move=> co_k_a; have [v Dv] := Qn_aut_exists co_k_a. -have [u Du_a Du_a'] := dvd_restrict_cfAut a v. -exists u => [gt0 G0 | ] chi x Zchi a_x; last by rewrite cfunE Du_a'. -rewrite cfunE {u Du_a'}Du_a //. -without loss{Zchi} Nchi: chi / chi \is a character. - move=> IH; case/vcharP: Zchi => [chi1 Nchi1 [chi2 Nchi2 ->]]. - by rewrite !cfunE rmorphB !IH. -have [sXG0 | G0'x] := boolP (<[x]> \subset G0); last first. - have /(<[x]> =P _) gen_xk: generator <[x]> (x ^+ k). - by rewrite generator_coprime coprime_sym (coprime_dvdr a_x). - by rewrite !cfun0 ?rmorph0 -?cycle_subG -?gen_xk. -rewrite -!(cfResE chi sXG0) ?cycle_id ?mem_cycle //. -rewrite ['Res _]cfun_sum_cfdot !sum_cfunE rmorph_sum; apply: eq_bigr => i _. -have chiX := lin_charX (char_abelianP _ (cycle_abelian x) i) _ (cycle_id x). -rewrite !cfunE rmorphM aut_Cnat ?Cnat_cfdot_char_irr ?cfRes_char //. -by congr (_ * _); rewrite Dv -chiX // -expg_mod_order (eqnP a_x) chiX. -Qed. - -Section ANT. -Import ssrint. - -(* This section covers Peterfalvi (1.10). *) -(* We have simplified the statement somewhat by substituting the global ring *) -(* of algebraic integers for the specific ring Z[eta]. Formally this amounts *) -(* to strengthening (b) and weakening (a) accordingly, but since actually the *) -(* Z[eta] is equal to the ring of integers of Q[eta] (cf. Theorem 6.4 in J.S. *) -(* Milne's course notes on Algebraic Number Theory), the simplified statement *) -(* is actually equivalent to the textbook one. *) -Variable (p : nat) (eps : algC). -Hypothesis (pr_eps : p.-primitive_root eps). -Local Notation e := (1 - eps). - -(* This is Peterfalvi (1.10) (a). *) -Lemma vchar_ker_mod_prim : {in G & G & 'Z[irr G], forall x y (chi : 'CF(G)), - #[x] = p -> y \in 'C[x] -> chi (x * y)%g == chi y %[mod e]}%A. -Proof. -move=> x y chi Gx Gy Zchi ox cxy; pose X := <<[set x; y]>>%G. -have [Xx Xy]: x \in X /\ y \in X by apply/andP; rewrite -!sub1set -join_subG. -have sXG: X \subset G by rewrite join_subG !sub1set Gx. -suffices{chi Zchi} IHiX i: ('chi[X]_i (x * y)%g == 'chi_i y %[mod e])%A. - rewrite -!(cfResE _ sXG) ?groupM //. - have irr_free := (free_uniq (basis_free (irr_basis X))). - have [c Zc ->] := (zchar_expansion irr_free (cfRes_vchar X Zchi)). - rewrite !sum_cfunE /eqAmod -sumrB big_seq rpred_sum // => _ /irrP[i ->]. - by rewrite !cfunE [(_ %| _)%A]eqAmodMl // rpred_Cint. -have lin_chi: 'chi_i \is a linear_char. - apply/char_abelianP; rewrite -[gval X]joing_idl -joing_idr abelianY. - by rewrite !cycle_abelian cycle_subG /= cent_cycle. -rewrite lin_charM // -{2}['chi_i y]mul1r eqAmodMr ?Aint_irr //. -have [|k ->] := (prim_rootP pr_eps) ('chi_i x). - by rewrite -lin_charX // -ox expg_order lin_char1. -rewrite -[_ ^+ k](subrK 1) subrX1 -[_ - 1]opprB mulNr -mulrN mulrC. -rewrite eqAmod_addl_mul // rpredN rpred_sum // => n _. -by rewrite rpredX ?(Aint_prim_root pr_eps). -Qed. - -(* This is Peterfalvi (1.10)(b); the primality condition is only needed here. *) -Lemma int_eqAmod_prime_prim n : - prime p -> n \in Cint -> (n == 0 %[mod e])%A -> (p %| n)%C. -Proof. -move=> p_pr Zn; rewrite /eqAmod unfold_in subr0. -have p_gt0 := prime_gt0 p_pr. -case: ifPn => [_ /eqP->// | nz_e e_dv_n]. -suffices: (n ^+ p.-1 == 0 %[mod p])%A. - rewrite eqAmod0_rat ?rpredX ?rpred_nat 1?rpred_Cint // !dvdC_int ?rpredX //. - by rewrite floorCX // abszX Euclid_dvdX // => /andP[]. -rewrite /eqAmod subr0 unfold_in pnatr_eq0 eqn0Ngt p_gt0 /=. -pose F := \prod_(1 <= i < p) ('X - (eps ^+ i)%:P). -have defF: F = \sum_(i < p) 'X^i. - apply: (mulfI (monic_neq0 (monicXsubC 1))); rewrite -subrX1. - by rewrite -(factor_Xn_sub_1 pr_eps) big_ltn. -have{defF} <-: F.[1] = p :> Algebraics.divisor. - rewrite -[p]card_ord -[rhs in _ = rhs]sumr_const defF horner_sum. - by apply: eq_bigr => i _; rewrite hornerXn expr1n. -rewrite -[p.-1]card_ord {F}horner_prod big_add1 big_mkord -prodfV. -rewrite -prodr_const -big_split rpred_prod //= => k _; rewrite !hornerE. -rewrite -[n](divfK nz_e) -[_ * _ / _]mulrA rpredM {e_dv_n}//. -have p'k: ~~ (p %| k.+1)%N by rewrite gtnNdvd // -{2}(prednK p_gt0) ltnS. -have [r {1}->]: exists r, eps = eps ^+ k.+1 ^+ r. - have [q _ /dvdnP[r Dr]] := Bezoutl p (ltn0Sn k); exists r; apply/esym/eqP. - rewrite -exprM (eq_prim_root_expr pr_eps _ 1) mulnC -Dr addnC gcdnC. - by rewrite -prime_coprime // in p'k; rewrite (eqnP p'k) modnMDl. -rewrite -[1 - _]opprB subrX1 -mulNr opprB mulrC. -rewrite mulKf; last by rewrite subr_eq0 eq_sym -(prim_order_dvd pr_eps). -by apply: rpred_sum => // i _; rewrite !rpredX ?(Aint_prim_root pr_eps). -Qed. - -End ANT. - -End Main. - - |
