diff options
| author | Enrico Tassi | 2015-03-09 11:07:53 +0100 |
|---|---|---|
| committer | Enrico Tassi | 2015-03-09 11:24:38 +0100 |
| commit | fc84c27eac260dffd8f2fb1cb56d599f1e3486d9 (patch) | |
| tree | c16205f1637c80833a4c4598993c29fa0fd8c373 /mathcomp/odd_order/PFsection14.v | |
Initial commit
Diffstat (limited to 'mathcomp/odd_order/PFsection14.v')
| -rw-r--r-- | mathcomp/odd_order/PFsection14.v | 1257 |
1 files changed, 1257 insertions, 0 deletions
diff --git a/mathcomp/odd_order/PFsection14.v b/mathcomp/odd_order/PFsection14.v new file mode 100644 index 0000000..bd7ae60 --- /dev/null +++ b/mathcomp/odd_order/PFsection14.v @@ -0,0 +1,1257 @@ +(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *) +Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice. +Require Import fintype tuple finfun bigop prime binomial ssralg poly finset. +Require Import fingroup morphism perm automorphism quotient action finalg zmodp. +Require Import gfunctor gproduct center cyclic commutator gseries nilpotent. +Require Import pgroup sylow hall abelian maximal frobenius. +Require Import matrix mxalgebra mxrepresentation mxabelem vector. +Require Import BGsection1 BGsection3 BGsection7. +Require Import BGsection14 BGsection15 BGsection16 BGappendixC. +Require Import ssrnum rat algC cyclotomic algnum. +Require Import classfun character integral_char inertia vcharacter. +Require Import PFsection1 PFsection2 PFsection3 PFsection4. +Require Import PFsection5 PFsection6 PFsection7 PFsection8 PFsection9. +Require Import PFsection10 PFsection11 PFsection12 PFsection13. + +(******************************************************************************) +(* This file covers Peterfalvi, Section 14: Non_existence of G. *) +(* It completes the proof of the Odd Order theorem. *) +(******************************************************************************) + +Set Implicit Arguments. +Unset Strict Implicit. +Unset Printing Implicit Defensive. + +Import GroupScope GRing.Theory FinRing.Theory Num.Theory. + +Section Fourteen. + +Variable gT : minSimpleOddGroupType. +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}. + +Local Notation "#1" := (inord 1) (at level 0). + +(* 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. *) +Section MoreSTlemmas. + +Local Open Scope ring_scope. +Variables W W1 W2 S T U V L : {group gT}. +Variables (tau1L : {additive 'CF(L) -> 'CF(G)}) (phi : 'CF(L)). + +(* Implicit (dependent) forward assuptions. *) +Hypotheses (defW : W1 \x W2 = W) (xdefW : W2 \x W1 = W) (maxL : L \in 'M). + +Local Notation "` 'S'" := (gval S) (at level 0, only parsing) : group_scope. +Local Notation P := `S`_\F%G. +Local Notation "` 'P'" := `S`_\F (at level 0) : group_scope. +Local Notation PU := S^`(1)%G. +Local Notation "` 'PU'" := `S^`(1)%g (at level 0) : group_scope. +Local Notation "` 'L'" := (gval L) (at level 0, only parsing). +Local Notation H := `L`_\F%G. +Local Notation "` 'H'" := `L`_\F%g (at level 0, format "` 'H'") : group_scope. + +Let p := #|W2|. +Let q := #|W1|. +Let u := #|U|. +Let v := #|V|. +Let h := #|H|. +Let e := #|L : H|. +Let ccG A := class_support A G. + +Let calL := seqIndD H L H 1. +Let betaL := 'Ind[L, H] 1 - phi. +Local Notation tauL := (FT_DadeF maxL). + +(* Explicit (non-dependent) forward assumptions. *) +Hypotheses (StypeP : of_typeP S U defW) (TtypeP : of_typeP T V xdefW). +Hypothesis (cohL : coherent_with calL L^# tauL tau1L) (Lphi : phi \in calL). + +(* The remaining assumptions can be generated as backchaining gools. *) +Hypotheses (maxS : S \in 'M) (maxT : T \in 'M). + +Let pddS := FT_prDade_hypF maxS StypeP. +Let pddT := FT_prDade_hypF maxT TtypeP. +Let ctiWG : cyclicTI_hypothesis G defW := pddS. +Let sigma := cyclicTIiso ctiWG. +Let w_ i j := cyclicTIirr defW i j. + +(* An inequality used in the proof of (14.11.4), at the bottom of page 90, to *) +(* show that 1/uq and 1/vp are less that 1/2q^2 (so Wn is either W1 or W2). *) +Lemma FTtypeP_complV_ltr (Wn : {group gT}) : + (#|Wn| <= q)%N -> (u * q)%:R^-1 < (2 * #|Wn| ^ 2)%:R^-1 :> algC. +Proof. +move=> leWn_q; rewrite !natrM ltf_pinv ?rpredM ?qualifE ?gt0CG ?ltr0n //. +rewrite -!natrM ltr_nat (@leq_ltn_trans (2 * q ^ 2)) ?mulnA ?leq_mul // mul2n. +have: [Frobenius U <*> W1 = U ><| W1] by have [[]] := FTtypeP_facts maxS StypeP. +by move/ltn_odd_Frobenius_ker/implyP; rewrite mFT_odd ltn_pmul2r ?cardG_gt0. +Qed. + +(* This formalizes the loose symmetry used in (14.11.3) to show that #[g] is *) +(* coprime to pq. *) +Lemma coprime_typeP_Galois_core g : + typeP_Galois StypeP -> g \notin ccG W^# -> g \notin ccG P^# -> coprime #[g] p. +Proof. +move=> galS W'g; apply: contraR => p_g. +have ntg: g != 1%g by apply: contraNneq p_g => ->; rewrite order1 coprime1n. +have [pr_q pr_p]: prime q /\ prime p := FTtypeP_primes maxS StypeP. +have [[_ hallW1 _ defS] [_ _ _ defPU] _ [_ _ sW2P _ regPUW1] _] := StypeP. +have coPUq: coprime #|PU| q by rewrite (coprime_sdprod_Hall_r defS). +have [[_ _ nPUW1 _] [_ _ nPU _]] := (sdprodP defS, sdprodP defPU). +have ntP: P :!=: 1%g := mmax_Fcore_neq1 maxS. +have frobPU: [Frobenius PU = P ><| U]. + have notS5 := FTtype5_exclusion maxS. + have inN1 x: x \in 'N(1) by rewrite norm1 inE. + have [_ ntU _ _] := compl_of_typeII_IV maxS StypeP notS5. + have [] := typeP_Galois_P maxS notS5 galS; rewrite Ptype_factor_prime //. + rewrite (group_inj (Ptype_Fcore_kernel_trivial _ _)) // => F [fP [fU _]]. + rewrite Ptype_Fcompl_kernel_trivial //. + case=> /trivgP injfU fJ [_ /isomP[injfP _] _] _. + apply/Frobenius_semiregularP=> // y /setD1P[nty Uy]. + apply/trivgP/subsetP=> x /setIP[Px /cent1P-cxy]; apply: contraR nty. + rewrite -(morph_injm_eq1 injfU) // -val_eqE -(cosetpre1 1) !(inN1, inE) /=. + rewrite -(morph_injm_eq1 injfP) ?mem_quotient //= => /mulfI/inj_eq <-. + rewrite mulr1 -[_ * _]fJ ?mem_quotient //= qactE ?dom_qactJ //=. + by rewrite conjgE cxy mulKg. +have pP: p.-group P by have [_ [/andP[]]] := FTtypeP_facts _ StypeP. +have{p_g}[y [a P1a cagy]]: exists y, exists2 a, a \in P^# & g ^ y \in 'C[a]. + have sylP: p.-Sylow(G) P. + have [/Hall_pi/= hallP _ _] := FTcore_facts maxS; apply: etrans hallP. + have [_ _ [n ->]] := pgroup_pdiv pP (mmax_Fcore_neq1 maxS). + by apply/eq_pHall => r1; rewrite pi_of_exp ?pi_of_prime. + have [y _ Pa] := Sylow_Jsub sylP (subsetT _) (p_elt_constt p g). + pose a := g.`_p ^ y; have{Pa} Pa: a \in P by rewrite -cycle_subG cycleJ. + exists y, a; last by rewrite cent1C /a conjXg groupX ?cent1id. + rewrite !inE conjg_eq1 (contraNneq _ p_g) // => /constt1P/p'nat_coprime-> //. + exact: pnat_id. +have /(mem_sdprod defS)[x [w [PUx W1w Dgy _]]]: g ^ y \in S. + have A0a: a \in 'A0(S) := subsetP (Fcore_sub_FTsupp0 maxS) a P1a. + have [_ _ _ _ [tiA0 _]] := FTtypeP_facts _ StypeP. + by rewrite (subsetP (cent1_normedTI tiA0 A0a)) // 2!inE. +suffices w_eq1: w = 1%g. + have sCaP: 'C_PU[a] \subset P := Frobenius_cent1_ker frobPU P1a. + rewrite -[g](conjgK y) mem_imset2 ?inE //= conjg_eq1 ntg /=. + by rewrite (subsetP sCaP) // inE cagy Dgy w_eq1 mulg1 PUx. +apply: contraNeq W'g => ntw; have nPUw := subsetP nPUW1 w W1w. +have{x PUx Dgy} /imset2P[x z W2w_x _ Dgy]: g ^ y \in class_support (W2 :* w) PU. + rewrite -(regPUW1 w) ?inE ?ntw // class_supportEr -cover_imset. + have coPUw := coprime_dvdr (order_dvdG W1w) coPUq. + have [/cover_partition-> _] := partition_cent_rcoset nPUw coPUw. + by rewrite Dgy mem_rcoset mulgK. +rewrite -[g](conjgK (y * z^-1)%g) mem_imset2 ?inE //= conjg_eq1 ntg /= conjgM. +by rewrite Dgy conjgK -(dprodWC defW) -[x](mulgKV w) mem_mulg -?mem_rcoset. +Qed. + +Hypothesis Stype2 : FTtype S == 2. + +(* This is used to bound #|ccG P^#| and #|ccG Q^#| in the proof of (14.11.4). *) +Lemma FTtype2_cc_core_ler : #|G|%:R^-1 * #|ccG P^#|%:R <= (u * q)%:R^-1 :> algC. +Proof. +have ->: (u * q)%:R^-1 = #|S|%:R^-1 * #|P|%:R :> algC. + have [[_ _ _ /sdprod_card <-] [_ _ _ /sdprod_card <-] _ _ _] := StypeP. + by rewrite mulrC -mulnA [in RHS]natrM invfM mulVKf ?neq0CG. +have [_ _] := FTtypeII_ker_TI maxS Stype2; rewrite FTsupp1_type2 // => tiP1. +rewrite {tiP1}(card_support_normedTI tiP1) natrM natf_indexg ?subsetT //. +rewrite mulrCA mulKf ?neq0CG // mulrC ler_pmul2l ?invr_gt0 ?gt0CG // leC_nat. +by rewrite cardsDS ?sub1G ?leq_subr. +Qed. + +Hypotheses (maxNU_L : L \in 'M('N(U))) (phi1 : phi 1%g = e%:R). + +(* This is Peterfalvi (14.11.2), stated for S and L rather than T and M; it *) +(* is loosely used in this form at the very end of the proof of (14.16). *) +Lemma FTtype2_support_coherence : + (u.-1 %/ q < h.-1 %/ e)%N -> (v.-1 %/ p < h.-1 %/ e)%N -> + [/\ e = (p * q)%N + & exists nb, exists2 chi, chi = tau1L phi \/ chi = - tau1L phi^*%CF + & tauL betaL = \sum_ij (-1)^+ nb ij *: sigma 'chi_ij - chi]. +Proof. +move=> ub_u ub_v; have nsHL : H <| L := gFnormal _ _. +have pairST := of_typeP_pair maxS StypeP maxT TtypeP. +have [//|frobL sUH defL] := FTtypeII_support_facts maxS StypeP _ pairST maxNU_L. +have Ltype1 := FT_Frobenius_type1 maxL frobL. +have irr_phi: phi \in irr L by apply: FTtype1_Ind_irr Lphi. +have betaL_P := FTtypeI_bridge_facts _ _ Ltype1 cohL Lphi phi1. +have e_dv_h1: e %| h.-1 by apply: Frobenius_ker_dvd_ker1. +pose a i j := '[tauL betaL, sigma (w_ i j)]. +have a0j j: j != 0 -> (a 0 j == 1 %[mod 2])%C. + rewrite /a => nz_j; case/betaL_P: StypeP => _ _ -> //. + by case=> [[_ /idPn[]] | [//]]; rewrite -natf_div // leC_nat -ltnNge. +have ai0 i: i != 0 -> (a i 0 == 1 %[mod 2])%C. + rewrite /a (cycTIisoC _ pddT) => nz_i; case/betaL_P: TtypeP => _ _ -> //. + by case=> [[_ /idPn[]] | [//]]; rewrite -natf_div // leC_nat -ltnNge. +have HbetaL: betaL \in 'CF(L, H^#) by apply: cfInd1_sub_lin_on Lphi phi1. +have betaL_W_0: {in cyclicTIset defW, tauL betaL =1 \0}. + move=> z; case/betaL_P: StypeP => tiAM_W _ _ _. + rewrite !inE -(setCK W) inE => /andP[_]; apply: cfun_onP z. + apply: cfun_onS (Dade_cfunS _ _); rewrite FT_DadeF_supportE -disjoints_subset. + rewrite -FTsupp_Frobenius // -setI_eq0 -subset0 -tiAM_W setIS //. + by rewrite setUC subsetU ?sub_class_support. +have calL_gt1: (1 < size calL)%N. + by apply: seqInd_nontrivial Lphi; rewrite ?mFT_odd. +have [] := Dade_Ind1_sub_lin cohL calL_gt1 irr_phi Lphi phi1; rewrite -/betaL. +rewrite -/calL odd_Frobenius_index_ler ?mFT_odd //= -/e -/h. +case=> _ a00 ZbetaL [Gamma [o_tau1_Ga o_1_Ga [aa Zaa Dbeta] []// _ ubGa _]]. +have{a00} a00: a 0 0 = 1 by rewrite /a /w_ cycTIirr00 cycTIiso1. +have{a0j ai0} a_odd i j: (a i j == 1 %[mod 2])%C. + have [[-> | /ai0 ai01] [-> | /a0j a0j1] //] := (eqVneq i 0, eqVneq j 0). + by rewrite a00 (eqCmod_nat 2 1 1). + by rewrite -(eqCmodDr _ 1) -{1}a00 cycTIiso_cfdot_exchange // eqCmodD. +have [_ o_tauLeta _ _] := FTtypeI_bridge_facts _ StypeP Ltype1 cohL Lphi phi1. +pose etaW := map sigma (irr W). +have o1eta: orthonormal etaW := cycTIiso_orthonormal _. +have [X etaX [Y [defGa oXY oYeta]]] := orthogonal_split etaW (Gamma + 1). +have lbY: 0 <= '[Y] ?= iff (Y == 0). + by split; rewrite ?cfnorm_ge0 // eq_sym cfnorm_eq0. +have [b Db defX] := orthonormal_span o1eta etaX. +do [rewrite addrC !addrA addrAC -addrA; set Z := _ - _] in Dbeta. +have oZeta: orthogonal Z etaW. + apply/orthoPl=> xi /memv_span; apply: {xi}(span_orthogonal o_tauLeta). + rewrite rpredB ?rpredZ ?big_seq ?rpred_sum ?memv_span ?map_f // => xi Lxi. + by rewrite rpredZ ?memv_span ?map_f. +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. + have ->: '[X, sigma 'chi_ij] = b_ij by rewrite /b_ij Db. + 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) => ->. + by rewrite (eqCmod_nat 2 0 1). + apply/eqP/exists_eqP=> [a2_1|[n ->]]; last by rewrite sqrr_sign. + rewrite (CintEsign Zaij) normC_def conj_Cint // -expr2 -a2_1 sqrtC1 mulr1. + by exists (a i j < 0). +have ub_e: e%:R <= #|Iirr W|%:R ?= iff (e == p * q)%N :> algC. + rewrite lerif_nat card_Iirr_cyclic //; last by have [] := ctiWG. + rewrite -(dprod_card xdefW); apply: leqif_eq. + case: defL => [|[y Qy]] defL; rewrite /e -(index_sdprod defL). + by rewrite leq_pmull ?cardG_gt0. + suffices /normP <-: y \in 'N(W1). + by rewrite -conjYg !cardJg (dprodWY defW) -(dprod_card xdefW). + have cQQ: abelian T`_\F by have [_ [/and3P[]]] := FTtypeP_facts maxT TtypeP. + have sW1Q: W1 \subset T`_\F by have [_ _ _ []] := TtypeP. + by rewrite (subsetP _ y Qy) // sub_abelian_norm. +have /(_ predT) := lerif_add (lerif_sum (in1W lb_b)) lbY. +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. +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). + by rewrite big_mkord size_tuple; apply: eq_bigr => ij; rewrite -tnth_nth Dn. +have Z1chi: chi \in dirr G. + rewrite dirrE rpredB //=; last first. + 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. + by rewrite (span_orthogonal oZeta) ?oppr0 // memv_span ?mem_head. + rewrite addrAC subrr add0r cfnormN Dade_isometry // cfnormBd; 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. + rewrite De (dprod_card xdefW) -card_Iirr_cyclic //; last by have[]:= ctiWG. + by rewrite -sumr_const; apply: eq_bigr => ij _; rewrite Dn normr_sign expr1n. +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 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 (seqInd_ortho_Ind1 _ _ Lphi) // conjC0 subrr add0r opprK. +by rewrite cfdot_conjCl (seqInd_conjC_ortho _ _ _ Lphi) ?mFT_odd ?conjC0 ?subr0. +Qed. + +End MoreSTlemmas. + +Section NonconjType1. +(* Properties of non-conjugate type I groups, used symmetrically for L and M *) +(* in the proofs of (14.14) and (14.16). *) + +Local Open Scope ring_scope. +Variables (M L : {group gT}) (phi : 'CF(L)) (psi : 'CF(M)). +Variable (tau1L : {additive 'CF(L) -> 'CF(G)}). +Variable (tau1M : {additive 'CF(M) -> 'CF(G)}). +Hypotheses (maxL : L \in 'M) (maxM : M \in 'M). +Let ddL := FT_DadeF_hyp maxL. +Let ddM := FT_DadeF_hyp maxM. +Let tauL := Dade ddL. +Let tauM := Dade ddM. +Let H := L`_\F%G. +Let K := M`_\F%G. +Let calL := seqIndD H L H 1. +Let calM := seqIndD K M K 1. +Let u : algC := #|L : H|%:R. +Let v : algC := #|M : K|%:R. +Let betaL := 'Ind[L, H] 1 - phi. +Let a := '[tauL betaL, tau1M psi]. + +Hypothesis (cohL : coherent_with calL L^# tauL tau1L). +Hypothesis (cohM : coherent_with calM M^# tauM tau1M). +Hypotheses (Lphi : phi \in calL) (Mpsi : psi \in calM). +Hypotheses (phi1 : phi 1%g = u) (psi1 : psi 1%g = v). +Hypotheses (Ltype1 : FTtype L == 1%N) (Mtype1 : FTtype M == 1%N). +Hypothesis not_MG_L : gval L \notin M :^: G. + +Let irrL := FTtype1_Ind_irr maxL Ltype1. +Let irrM := FTtype1_Ind_irr maxM Mtype1. + +Lemma disjoint_Dade_FTtype1 : [disjoint Dade_support ddM & Dade_support ddL]. +Proof. +by rewrite !FT_DadeF_supportE -!FTsupp1_type1 ?FT_Dade1_support_disjoint. +Qed. +Let TItauML := disjoint_Dade_FTtype1. + +Lemma coherent_FTtype1_ortho : orthogonal (map tau1M calM) (map tau1L calL). +Proof. +apply/orthogonalP=> _ _ /mapP[xiM Mxi ->] /mapP[xiL Lxi ->]. +have [irrLxi irrMxi] := (irrL Lxi, irrM Mxi). +exact: (disjoint_coherent_ortho (mFT_odd _) _ cohM cohL). +Qed. +Let oML := coherent_FTtype1_ortho. + +(* This is the inequality used in both branches of (14.14). *) +Lemma coherent_FTtype1_core_ltr : a != 0 -> #|K|.-1%:R / v <= u - 1. +Proof. +have [nsHL nsKM]: H <| L /\ K <| M by rewrite !gFnormal. +have [irr_phi irr_psi] := (irrL Lphi, irrM Mpsi). +have frobL: [Frobenius L with kernel H] := FTtype1_Frobenius maxL Ltype1. +have [[Itau1 Ztau1] Dtau1] := cohM. +have o1M: orthonormal (map tau1M calM). + apply: map_orthonormal Itau1 _. + exact: sub_orthonormal (undup_uniq _) (irr_orthonormal M). +have Lgt1: (1 < size calL)%N by apply: seqInd_nontrivial (mFT_odd _ ) _ _ Lphi. +have [[_ _]] := Dade_Ind1_sub_lin cohL Lgt1 irr_phi Lphi phi1. +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 //. +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. + by rewrite ler_pemull ?sqr_Cint_ge1 // divr_ge0 ?ler0n. +have [_ -> defX] := orthonormal_span o1M M_X. +have Mgt1: (1 < size calM)%N by apply: seqInd_nontrivial (mFT_odd _ ) _ _ Mpsi. +have [[oM1 _ _] _ _] := Dade_Ind1_sub_lin cohM Mgt1 irr_psi Mpsi psi1. +rewrite exprMn -(Cint_normK Za) -[v]normr_nat -normfV -/v mulr_sumr. +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 (cfdotElr (Dade_cfunS _ _) (Dade_cfunS _ _)) setIC. +by have:= TItauML; rewrite -setI_eq0 => /eqP->; rewrite big_set0 mulr0. +Qed. + +End NonconjType1. + +(* This is the context associated with Hypothesis (13.1). *) +Variables S T U V W W1 W2 : {group gT}. +Hypotheses (defW : W1 \x W2 = W) (xdefW : W2 \x W1 = W). +Hypotheses (pairST : typeP_pair S T defW) (maxS : S \in 'M) (maxT : T \in 'M). +Hypotheses (StypeP : of_typeP S U defW) (TtypeP : of_typeP T V xdefW). + +Local Notation "` 'W1'" := (gval W1) (at level 0, only parsing) : group_scope. +Local Notation "` 'W2'" := (gval W2) (at level 0, only parsing) : group_scope. +Local Notation "` 'W'" := (gval W) (at level 0, only parsing) : group_scope. +Local Notation What := (cyclicTIset defW). + +Local Notation "` 'S'" := (gval S) (at level 0, only parsing) : group_scope. +Local Notation P := `S`_\F%G. +Local Notation "` 'P'" := `S`_\F (at level 0) : group_scope. +Local Notation PU := S^`(1)%G. +Local Notation "` 'PU'" := `S^`(1) (at level 0) : group_scope. +Local Notation "` 'U'" := (gval U) (at level 0, only parsing) : group_scope. + +Local Notation "` 'T'" := (gval T) (at level 0, only parsing) : group_scope. +Local Notation Q := `T`_\F%G. +Local Notation "` 'Q'" := `T`_\F (at level 0) : group_scope. +Local Notation QV := T^`(1)%G. +Local Notation "` 'QV'" := `T^`(1) (at level 0) : group_scope. +Local Notation "` 'V'" := (gval V) (at level 0, only parsing) : group_scope. + +Let defS : PU ><| W1 = S. Proof. by have [[]] := StypeP. Qed. +Let defPU : P ><| U = PU. Proof. by have [_ []] := StypeP. Qed. + +Let defT : QV ><| W2 = T. Proof. by have [[]] := TtypeP. Qed. +Let defQV : Q ><| V = QV. Proof. by have [_ []] := TtypeP. Qed. + +Let notStype1 : FTtype S != 1%N. Proof. exact: FTtypeP_neq1 StypeP. Qed. +Let notStype5 : FTtype S != 5%N. Proof. exact: FTtype5_exclusion maxS. Qed. + +Let pddS := FT_prDade_hypF maxS StypeP. +Let ptiWS : primeTI_hypothesis S PU defW := FT_primeTI_hyp StypeP. +Let ctiWG : cyclicTI_hypothesis G defW := pddS. + +Let pddT := FT_prDade_hypF maxT TtypeP. +Let ptiWT : primeTI_hypothesis T QV xdefW := FT_primeTI_hyp TtypeP. + +Let ntW1 : W1 :!=: 1. Proof. by have [[]] := StypeP. Qed. +Let ntW2 : W2 :!=: 1. Proof. by have [_ _ _ []] := StypeP. Qed. +Let cycW1 : cyclic W1. Proof. by have [[]] := StypeP. Qed. +Let cycW2 : cyclic W2. Proof. by have [_ _ _ []] := StypeP. Qed. + +Let p := #|W2|. +Let q := #|W1|. +Let u := #|U|. +Let v := #|V|. +Let nU := (p ^ q).-1 %/ p.-1. +Let nV := (q ^ p).-1 %/ q.-1. + +Let pr_p : prime p. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed. +Let pr_q : prime q. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed. + +Local Open Scope ring_scope. + +Let qgt2 : (q > 2)%N. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed. +Let pgt2 : (p > 2)%N. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed. + +Let coPUq : coprime #|PU| q. +Proof. by rewrite (coprime_sdprod_Hall_r defS); have [[]] := StypeP. Qed. + +Let nirrW1 : #|Iirr W1| = q. Proof. by rewrite card_Iirr_cyclic. Qed. +Let nirrW2 : #|Iirr W2| = p. Proof. by rewrite card_Iirr_cyclic. Qed. +Let NirrW1 : Nirr W1 = q. Proof. by rewrite -nirrW1 card_ord. Qed. +Let NirrW2 : Nirr W2 = p. Proof. by rewrite -nirrW2 card_ord. Qed. + +Let sigma := (cyclicTIiso ctiWG). +Let w_ i j := (cyclicTIirr defW i j). +Local Notation eta_ i j := (sigma (w_ i j)). + +Local Notation Imu2 := (primeTI_Iirr ptiWS). +Let mu2_ i j := primeTIirr ptiWS i j. +Let mu_ := primeTIred ptiWS. +Local Notation chi_ j := (primeTIres ptiWS j). + +Local Notation Inu2 := (primeTI_Iirr ptiWT). +Let nu2_ i j := primeTIirr ptiWT j i. +Let nu_ := primeTIred ptiWT. + +Local Notation tauS := (FT_Dade0 maxS). +Local Notation tauT := (FT_Dade0 maxT). + +Let calS0 := seqIndD PU S S`_\s 1. +Let rmR_S := FTtypeP_coh_base maxS StypeP. +Let scohS0 : subcoherent calS0 tauS rmR_S. +Proof. exact: FTtypeP_subcoherent StypeP. Qed. + +Let calS := seqIndD PU S P 1. +Let sSS0 : cfConjC_subset calS calS0. +Proof. exact/seqInd_conjC_subset1/Fcore_sub_FTcore. Qed. + +Let calT := seqIndD QV T Q 1. + +(* This is Hypothesis (14.1). *) +Hypothesis ltqp: (q < p)%N. + +(* This corresponds to Peterfalvi, Theorem (14.2). *) +(* As we import the conclusion of BGappendixC, which covers Appendix C of the *) +(* Bender and Glauberman text, we can state this theorem negatively. This *) +(* will avoid having to repeat its statement thoughout the proof : we will *) +(* simply end each nested set of assumptions (corresponding to (14.3) and *) +(* (14.10)) with a contradiction. *) +Theorem no_full_FT_Galois_structure : + ~ [/\ (*a*) exists Fpq : finFieldImage P W2 U, + [/\ #|P| = (p ^ q)%N, #|U| = nU & coprime nU p.-1] + & (*b*) [/\ q.-abelem Q, W2 \subset 'N(Q) + & exists2 y, y \in Q & W2 :^ y \subset 'N(U)]]. +Proof. +case=> [[Fpq [oP oU coUp1]] [abelQ nQW2 nU_W2Q]]. +have /idPn[] := ltqp; rewrite -leqNgt. +exact: (prime_dim_normed_finField _ _ _ defPU) nU_W2Q. +Qed. + +(* Justification for Hypothesis (14.3). *) +Fact FTtypeP_max_typeII : FTtype S == 2. +Proof. by have [[_ ->]] := FTtypeP_facts maxS StypeP. Qed. +Let Stype2 := FTtypeP_max_typeII. + +(* These correspond to Peterfalvi, Hypothesis (14.3). *) +Variables (L : {group gT}) (tau1L : {additive 'CF(L) -> 'CF(G)}) (phi : 'CF(L)). +Local Notation "` 'L'" := (gval L) (at level 0, only parsing). +Local Notation H := `L`_\F%G. +Local Notation "` 'H'" := `L`_\F%g (at level 0, format "` 'H'") : group_scope. + +Hypothesis maxNU_L : L \in 'M('N(U)). + +(* Consequences of the above. *) +Hypotheses (maxL : L \in 'M) (sNUL : 'N(U) \subset L) (sUH : U \subset H). +Hypotheses (frobL : [Frobenius L with kernel H]) (Ltype1 : FTtype L == 1%N). + +Let calL := seqIndD H L H 1. +Local Notation tauL := (FT_DadeF maxL). +Let nsHL : H <| L. Proof. exact: gFnormal. Qed. +Let irrL : {subset calL <= irr L}. Proof. exact: FTtype1_Ind_irr. Qed. + +Hypothesis cohL : coherent_with calL L^# tauL tau1L. +Hypotheses (Lphi : phi \in calL) (phi1 : phi 1%g = #|L : H|%:R). + +Let betaS := FTtypeP_bridge StypeP #1. +Let betaT := FTtypeP_bridge TtypeP #1. +Let betaL := 'Ind[L, H] 1 - phi. + +(* This is the first assertion of Peterfalvi (14.4). *) +Let galT : typeP_Galois TtypeP. +Proof. +apply: contraLR ltqp => /(FTtypeP_nonGalois_facts maxT)[]. +by rewrite -/p -leqNgt => ->. +Qed. + +(* This is the second assertion of Peterfalvi (14.4). *) +Let oV : v = nV. +Proof. +rewrite /v (card_FTtypeP_Galois_compl maxT galT) -/nV. +by rewrite !modn_small ?gtn_eqF // ltnW. +Qed. + +(* This is Peterfalvi (14.5). *) +Let defL : exists2 y, y \in Q & H ><| (W1 <*> W2 :^ y) = L. +Proof. +have [//|_ _ []// defL] := FTtypeII_support_facts maxS StypeP _ pairST maxNU_L. +have [_ _ /negP[]] := compl_of_typeII maxS StypeP Stype2. +have [_ _ _] := FTtypeI_bridge_facts maxS StypeP Ltype1 cohL Lphi phi1. +case=> [[_ ubH] | [_ /idPn[]]]; last by rewrite -(index_sdprod defL) -ltnNge. +have{ubH} /eqP defH: `H == U. + rewrite eq_sym eqEcard sUH /= -(prednK (cardG_gt0 U)) -add1n -leq_subLR subn1. + have [_ _ _ _ /divnK <-] := FTtypeP_bridge_facts maxS StypeP. + by rewrite -leC_nat natrM -ler_pdivr_mulr ?gt0CG // {1}(index_sdprod defL). +rewrite (subset_trans sNUL) // -(sdprodW defL) -(sdprodW defS) mulSg //. +by rewrite -(sdprodW defPU) defH mulG_subr. +Qed. + +Let indexLH : #|L : H| = (p * q)%N. +Proof. +have [y Qy /index_sdprod <-] := defL; rewrite (dprod_card xdefW). +suffices /normP <-: y \in 'N(W1) by rewrite -conjYg cardJg (dprodWY defW). +have cQQ: abelian Q by have [_ [/and3P[]]] := FTtypeP_facts _ TtypeP. +by apply: (subsetP (sub_abelian_norm cQQ _)) => //; have [_ _ _ []] := TtypeP. +Qed. + +(* This is Peterfalvi (14.6). *) +Let galS : typeP_Galois StypeP. +Proof. +apply/idPn=> gal'S; have [q3 oU] := FTtypeP_nonGalois_facts maxS gal'S. +have [H1 [_ _ _ _]] := typeP_Galois_Pn maxS (FTtype5_exclusion maxS) gal'S. +rewrite def_Ptype_factor_prime // Ptype_Fcompl_kernel_trivial // -/p q3 /=. +set a := #|U : _| => [] [a_gt1 a_dv_p1 _ [U1 isoU1]]. +have{isoU1} isoU: U \isog U1 := isog_trans (quotient1_isog U) isoU1. +have{a_gt1 a_dv_p1} defU1: U1 :=: [set: 'rV_2]. + apply/eqP; rewrite eqEcard subsetT -(card_isog isoU) oU. + rewrite cardsT card_matrix card_ord Zp_cast // leq_sqr -/p. + apply: dvdn_leq; first by rewrite -(subnKC pgt2). + rewrite -divn2 -(@Gauss_dvdl a _ 2) ?divnK //. + by rewrite dvdn2 -subn1 odd_sub ?odd_gt0 ?mFT_odd. + by rewrite coprimen2 (dvdn_odd (dvdn_indexg U _)) ?mFT_odd. +have [r pr_r r_r_U] := rank_witness U. +have [R0 sylR0] := Sylow_exists r U; have [sR0U rR0 _] := and3P sylR0. +have [R sylR sR0R] := Sylow_superset (subset_trans sR0U sUH) rR0. +have [sRH rR _] := and3P sylR. +have cUU: abelian U by have [[]] := FTtypeP_facts maxS StypeP. +have tiA0: normedTI 'A0(S) G S by have [_ _ _ _ []] := FTtypeP_facts _ StypeP. +have [_ sUPU _ nPU _] := sdprod_context defPU. +have coPU := coprimegS (joing_subl U W1) (Ptype_Fcore_coprime StypeP). +have abR0: abelian R0 := abelianS sR0U cUU. +have{a U1 defU1 isoU r_r_U} rR0_2: 'r(R0) = 2. + by rewrite (rank_Sylow sylR0) -r_r_U (isog_rank isoU) defU1 rank_mx_group. +have piUr: r \in \pi(U) by rewrite -p_rank_gt0 -(rank_Sylow sylR0) rR0_2. +have /exists_inP[x /setD1P[ntx R0x] ntCPx]: [exists x in R0^#, 'C_P[x] != 1%g]. + have ncycR0: ~~ cyclic R0 by rewrite abelian_rank1_cyclic ?rR0_2. + have coPR0: coprime #|P| #|R0| := coprimegS sR0U coPU. + rewrite -negb_forall_in; apply: contra (mmax_Fcore_neq1 maxS) => regR0P. + rewrite -subG1 -(coprime_abelian_gen_cent1 abR0 _ (subset_trans sR0U nPU)) //. + by rewrite gen_subG; apply/bigcupsP=> x /(eqfun_inP regR0P)->. +have{x ntx R0x ntCPx} sZR_R0: 'Z(R) \subset R0. + have A0x: x \in 'A0(S). + have [z /setIP[Pz cyz] ntz] := trivgPn _ ntCPx. + apply/setUP; left; apply/bigcupP; exists z. + by rewrite !inE ntz (subsetP (Fcore_sub_FTcore maxS)). + by rewrite (eqP Stype2) 3!inE ntx cent1C (subsetP sUPU) ?(subsetP sR0U). + have sCxS: 'C[x] \subset S by rewrite -['C[x]]setTI (cent1_normedTI tiA0). + suffices <-: 'C_R[x] = R0. + by rewrite -cent_set1 setIS ?centS // sub1set (subsetP sR0R). + have /Hall_pi hallU: Hall PU U by rewrite -(coprime_sdprod_Hall_r defPU). + have /Hall_pi hallPU: Hall S PU by rewrite -(coprime_sdprod_Hall_l defS). + have sylR0_S: r.-Sylow(S) R0. + by apply: subHall_Sylow piUr sylR0; apply: subHall_Hall (piSg sUPU) hallU. + rewrite ['C_R[x]](sub_pHall sylR0_S) ?(pgroupS _ rR) ?subsetIl //. + by rewrite subsetI sR0R sub_cent1 (subsetP abR0). + by rewrite subIset ?sCxS ?orbT. +pose R1 := 'Ohm_1('Z(R))%G; pose m := logn r #|R1|. +have sR10: R1 \subset R0 by rewrite (subset_trans (Ohm_sub 1 _)). +have oR1: #|R1| = (r ^ m)%N by rewrite -card_pgroup ?(pgroupS sR10). +have{sZR_R0 rR0_2} m12: pred2 1%N 2 m. + transitivity (0 < m < 1 + 2)%N; first by rewrite -mem_iota !inE. + rewrite -[m]p_rank_abelian ?center_abelian -?rank_pgroup ?(pgroupS sZR_R0) //. + rewrite rank_gt0 ltnS -rR0_2 rankS // center_nil_eq1 ?(pgroup_nil rR) //. + by rewrite (subG1_contra sR0R) // -rank_gt0 rR0_2. +have [y Qy defLy] := defL; have [_ _ /joing_subP[_ nHW2y] _] := sdprodP defLy. +have chR1H: R1 \char H. + apply: char_trans (char_trans (Ohm_char 1 _) (center_char R)) _. + by rewrite (nilpotent_Hall_pcore (Fcore_nil L) sylR) gFchar. +have nR1W2y: W2 :^ y \subset 'N(R1) := char_norm_trans chR1H nHW2y. +have regR1W2y: semiregular R1 (W2 :^ y). + have /Frobenius_reg_ker regHW12y := set_Frobenius_compl defLy frobL. + exact: semiregularS (char_sub chR1H) (joing_subr _ _) regHW12y. +have /idPn[]: r %| p.-1./2. + have:= piUr; rewrite mem_primes => /and3P[_ _ /=]. + by rewrite oU Euclid_dvdX ?andbT. +rewrite gtnNdvd //; first by rewrite -(subnKC pgt2). +apply: leq_trans (_ : p.-1 <= r)%N. + by rewrite -divn2 ltn_divLR // -{1}[p.-1]muln1 -(subnKC pgt2) ltn_pmul2l. +have: p %| (r ^ m).-1. + by have:= regular_norm_dvd_pred nR1W2y regR1W2y; rewrite cardJg oR1. +rewrite -[p.-1]subn1 leq_subLR predn_exp Euclid_dvdM // => /orP[]/dvdn_leq. + by rewrite -(subnKC (prime_gt1 pr_r)) => /implyP/leq_trans->; rewrite 2?ltnW. +move/implyP; case/pred2P: m12 => ->; rewrite !big_ord_recl big_ord0 ?addn0 //=. +by rewrite -(subnKC pgt2). +Qed. + +(* This is Peterfalvi (14.7). *) +Let not_charUH : ~~ (U \char H). +Proof. +have [y Qy defLy] := defL; have [_ _ /joing_subP[_ nHW2y] _] := sdprodP defLy. +apply/negP=> chUH; have nUW2y := char_norm_trans chUH nHW2y. +case: no_full_FT_Galois_structure; split; last first. + split; [by have [_ []] := FTtypeP_facts _ TtypeP | | by exists y]. + by have /sdprodP[_ _ /joing_subP[]] := Ptype_Fcore_sdprod TtypeP. +have <-: #|U| = nU. + have regUW2y: semiregular U (W2 :^ y). + have /Frobenius_reg_ker regHW12y := set_Frobenius_compl defLy frobL. + exact: semiregularS (char_sub chUH) (joing_subr _ _) regHW12y. + case: ifP (card_FTtypeP_Galois_compl maxS galS) => //. + rewrite -/p -/q -/nU => p_modq_1 oU. + have{p_modq_1 oU} oU: (#|U| * q)%N = nU. + by rewrite oU divnK //; have [|_ ->] := FTtypeP_primes_mod_cases _ StypeP. + have /eqP Umodp: #|U| == 1 %[mod p]. + have:= regular_norm_dvd_pred nUW2y regUW2y. + by rewrite cardJg -/p -subn1 eqn_mod_dvd. + have: nU == 1 %[mod p]. + rewrite /nU predn_exp mulKn; last by rewrite -(subnKC pgt2). + rewrite -(ltn_predK qgt2) big_ord_recl addnC -modnDml -modn_summ modnDml. + by rewrite big1 // => i _; rewrite expnS modnMr. + by rewrite -oU -modnMml Umodp modnMml mul1n !modn_small ?gtn_eqF ?prime_gt1. +have [F []] := typeP_Galois_P maxS (FTtype5_exclusion maxS) galS. +rewrite Ptype_factor_prime ?(group_inj (Ptype_Fcore_kernel_trivial _ _)) //. +rewrite Ptype_Fcompl_kernel_trivial // => psiP [psiU _ [/trivgP inj_psiU psiJ]]. +rewrite /= -injm_subcent ?coset1_injm ?norms1 // -morphim_comp -/p. +rewrite (typeP_cent_core_compl StypeP) => [[_ /isomP[inj_psiP im_psiP] psiW2]]. +rewrite -(card_isog (quotient1_isog U)) => [[_ coUp1 _]]. +suffices FPU: finFieldImage P W2 U. + by exists FPU; have [_ []] := FTtypeP_facts maxS StypeP. +have /domP[sig [Dsig Ksig _ im_sig]]: 'dom (psiP \o coset 1) = P. + by apply: injmK; rewrite ?coset1_injm ?norms1. +have{Ksig} inj_sig: 'injm sig by rewrite Ksig injm_comp ?coset1_injm. +exists F sig; first by apply/isomP; rewrite im_sig morphim_comp. + by rewrite -psiW2 -im_sig injmK // -(typeP_cent_core_compl StypeP) subsetIl. +exists psiU => // z x Pz Ux /=; have inN1 x1: x1 \in 'N(1) by rewrite norm1 inE. +by rewrite !Dsig -psiJ ?mem_morphim //= qactE ?dom_qactJ. +Qed. + +(* This is Peterfalvi (14.8)(a). *) +(* In order to avoid the use of real analysis and logarithms we bound the *) +(* binomial expansion of n.+1 ^ q.+1 directly. *) +Let qp1_gt_pq1 : (q ^ p.+1 > p ^ q.+1)%N. +Proof. +have: (4 < p)%N by rewrite odd_geq ?mFT_odd ?(leq_trans _ ltqp). +elim: p ltqp => // n IHn; rewrite !ltnS => ngeq. +rewrite leq_eqVlt => /predU1P[/esym n4 | ngt4]. + suffices /eqP <-: 3 == q by rewrite n4. + by rewrite eqn_leq qgt2 -ltnS -(odd_ltn 5) ?mFT_odd // -n4. +apply: leq_trans (_ : q * n ^ q.+1 <= _)%N; last first. + rewrite (expnS q) leq_mul //. + by move: ngeq; rewrite leq_eqVlt => /predU1P[-> | /IHn/(_ ngt4)/ltnW]. +apply: leq_trans (_ : (2 * q.+1 + n) * n ^ q <= _)%N; last first. + rewrite expnS mulnA leq_mul // addnC. + move: ngeq; rewrite leq_eqVlt => /predU1P[-> | n_gtq]. + apply: leq_trans (_ : 4 * n <= _)%N; last by rewrite leq_mul // ltnW. + by rewrite mulnSr addnA -mulSn (mulSnr 3) leq_add2l 3?ltnW. + by rewrite -{2}(subnKC qgt2) addSn (mulSn _ n) leq_add2l leq_mul. +rewrite mulnDl -expnS -[n.+1]add1n expnDn big_ord_recr binn subnn !mul1n /=. +rewrite ltn_add2r -(@ltn_pmul2l (2 ^ q)) ?expn_gt0 // !mulnA -expnSr. +apply: leq_ltn_trans (_ : (2 ^ q.+1).-1 * q.+1 * n ^ q < _)%N; last first. + by rewrite -(subnKC ngt4) !ltn_pmul2r ?prednK ?expn_gt0. +rewrite -mulnA predn_exp mul1n big_distrr big_distrl leq_sum // => [[i]] /=. +rewrite ltnS exp1n mul1n => leiq _; rewrite -{1 4}(subnKC leiq) !expnD. +rewrite -mulnA leq_mul // mulnA mulnCA mulnC leq_mul // -bin_sub ?leqW //. +rewrite -(leq_pmul2r (fact_gt0 (q.+1 - i))) -mulnA bin_ffact mulnC subSn //. +rewrite ffactnS /= -!mulnA leq_mul //=; elim: {i leiq}(q - i)%N => //= i IHi. +rewrite ffactnSr expnSr mulnACA expnS factS (mulnACA n) mulnC leq_mul //. +by rewrite leq_mul // (leq_trans (leq_subr _ _)). +Qed. + +(* This is Peterfalvi (14.8)(b). *) +Let v1p_gt_u1q : (v.-1 %/ p > u.-1 %/ q)%N. +Proof. +have ub_u: (u.-1 <= nU - 1)%N. + rewrite -subn1 leq_sub2r //; have [_ _] := FTtypeP_facts maxS StypeP. + by rewrite (FTtypeP_reg_Fcore maxS StypeP) indexg1. +rewrite ltn_divLR ?prime_gt0 // {ub_u}(leq_ltn_trans ub_u) //. +have p_dv_v1: p %| v.-1 by have [] := FTtypeP_bridge_facts maxT TtypeP. +rewrite divn_mulAC // ltn_divRL ?dvdn_mulr // oV -subn1. +rewrite -(@ltn_pmul2l q.-1) ?(mulnCA q.-1); last by rewrite -(subnKC qgt2). +rewrite !mulnA -(@ltn_pmul2l p.-1); last by rewrite -(subnKC pgt2). +rewrite -mulnA mulnCA mulnA !(mulnBl _ _ _.-1) !divnK ?dvdn_pred_predX //. +rewrite !mul1n mulnCA -!subn1 ltn_mul ?ltn_sub2r ?prime_gt1 //. +rewrite -!subnDA !subnKC ?prime_gt0 // !mulnBl -!expnSr !mulnn. +by rewrite -subSn ?leq_exp2l ?leqW ?prime_gt1 ?leq_sub ?leq_exp2r // ltnW. +Qed. + +Let calT0 := seqIndD QV T T`_\s 1. +Let rmR_T := FTtypeP_coh_base maxT TtypeP. +Let scohT0 : subcoherent calT0 tauT rmR_T. +Proof. exact: FTtypeP_subcoherent. Qed. + +Let sTT0 : cfConjC_subset calS calS0. +Proof. exact/seqInd_conjC_subset1/Fcore_sub_FTcore. Qed. + +(* This is Peterfalvi (14.9). *) +Lemma FTtypeP_min_typeII : FTtype T == 2. +Proof. +apply: contraLR v1p_gt_u1q => notTtype2; rewrite -leqNgt -leC_nat. +have [o_betaT0_eta _ [Ttype3 _]] := FTtype34_structure maxT TtypeP notTtype2. +have Ttype_gt2: (2 < FTtype T)%N by rewrite (eqP Ttype3). +have [[_ _ frobVW2 cVV] _ _ _ _] := FTtypeP_facts _ TtypeP. +pose calT1 := seqIndD QV T QV Q; have sT10: cfConjC_subset calT1 calT0. + by apply/seqInd_conjC_subset1; rewrite /= FTcore_eq_der1. +rewrite (FTtypeP_reg_Fcore maxT TtypeP) (group_inj (joingG1 _)) in o_betaT0_eta. +do [rewrite -/calT1; set eta_0 := \sum_j _] in o_betaT0_eta. +have scohT1: subcoherent calT1 tauT rmR_T := subset_subcoherent scohT0 sT10. +have [nsQQV sVQV _ _ _] := sdprod_context defQV. +have nsQVT: QV <| T := der_normal 1 T. +have calT1_1p zeta: zeta \in calT1 -> zeta 1%g = p%:R. + case/seqIndP=> s /setDP[kerQs _] -> /=; rewrite inE in kerQs. + rewrite cfInd1 ?gFsub // -(index_sdprod defT) lin_char1 ?mulr1 //. + rewrite lin_irr_der1 (subset_trans _ kerQs) // der1_min ?normal_norm //. + by rewrite -(isog_abelian (sdprod_isog defQV)). +have [tau1T cohT1]: coherent calT1 T^# tauT. + apply/(uniform_degree_coherence scohT1)/(@all_pred1_constant _ p%:R). + by apply/allP=> _ /mapP[zeta T1zeta ->]; rewrite /= calT1_1p. +have irrT1: {subset calT1 <= irr T}. + move=> _ /seqIndP[s /setDP[kerQs nz_s] ->]; rewrite inE in kerQs. + rewrite inE subGcfker in nz_s; rewrite -(quo_IirrK nsQQV kerQs) mod_IirrE //. + rewrite cfIndMod ?normal_sub ?cfMod_irr ?gFnormal //. + rewrite irr_induced_Frobenius_ker ?quo_Iirr_eq0 //=. + have /sdprod_isom[nQ_VW1 /isomP[injQ <-]] := Ptype_Fcore_sdprod TtypeP. + have ->: (QV / Q)%g = (V / Q)%g by rewrite -(sdprodW defQV) quotientMidl. + have ->: (V / Q)%g = restrm nQ_VW1 (coset Q) @* V. + by rewrite morphim_restrm (setIidPr _) // joing_subl. + by rewrite injm_Frobenius_ker // (FrobeniusWker frobVW2). +have [[A0betaS PVbetaS] _ [_]] := FTtypeP_bridge_facts maxS StypeP. +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. +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]. + rewrite rpredD ?cycTIiso_vchar // rpredB ?rpred1 ?Dade_vchar // zchar_split. + by rewrite A0betaS ?Iirr1_neq0 // rpredB ?cfInd_vchar ?rpred1 ?irr_vchar. + move=> T1zeta; rewrite expr_ge1 ?normr_ge0 // norm_Cint_ge1 //. + by rewrite Cint_cfdot_vchar ?Ztau1T ?(mem_zchar T1zeta). + suffices: ('[Gamma, tau1T zeta] == 1 %[mod 2])%C. + by apply: contraTneq => ->; rewrite (eqCmod_nat 2 0 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 //. + 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. + by rewrite /nu_ -cfInd_prTIres cfInd_normal. + by rewrite !cfunE prTIred_1 prTIirr0_1 mulr1 calT1_1p ?subrr. + have A0betaT0: betaT0 \in 'CF(T, 'A0(T)). + by rewrite (cfun_onS (FTsupp1_sub0 _)) // /'A1(T) ?FTcore_eq_der1. + have ZbetaT0: betaT0 \in 'Z[irr T]. + 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 -(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 //. + apply: cfun_onS (cfInd_on (subsetT S) (PVbetaS _ nz_i1)). + apply/subsetP=> x PWx; rewrite inE. + have{PWx}: p \in \pi(#[x]). + case/imset2P: PWx => {x}x y PWx _ ->; rewrite {y}orderJ. + case/setUP: PWx => [/setD1P[ntx Px] | /imset2P[{x}x y Wx _ ->]]. + rewrite -p_rank_gt0 -rank_pgroup ?rank_gt0 ?cycle_eq1 //. + exact: mem_p_elt (abelem_pgroup pP) Px. + case/setDP: Wx; rewrite {y}orderJ; have [_ <- cW12 _] := dprodP defW. + case/mulsgP=> {x}x y W1x W2y ->; have cyx := centsP cW12 _ W2y _ W1x. + have [-> | nty _] := eqVneq y 1%g; first by rewrite inE mulg1 W1x. + have p'x: p^'.-elt x. + by rewrite (mem_p_elt _ W1x) /pgroup ?pnatE ?inE ?ltn_eqF. + have p_y: p.-elt y by rewrite (mem_p_elt (pnat_id _)). + rewrite -cyx orderM ?(pnat_coprime p_y) // pi_ofM // inE /=. + by rewrite -p_rank_gt0 -rank_pgroup // rank_gt0 cycle_eq1 nty. + apply: contraL => /imset2P[z y /setD1P[_ QVz] _ ->]; rewrite {x y}orderJ. + rewrite -p'natEpi // [_.-nat _](mem_p_elt _ QVz) // /pgroup ?p'natE //. + rewrite -prime_coprime // coprime_sym (coprime_sdprod_Hall_r defT). + by have [[]] := TtypeP. + have [_ _ _ _ [_ -> //]] := FTtypeP_facts _ TtypeP. + rewrite (cfdotElr QV'betaS (cfInd_on _ QVbetaT0)) ?subsetT //=. + rewrite setIC setICr big_set0 mulr0 subr0 addrC /eqCmod addrK. + rewrite cfdot_real_vchar_even ?mFT_odd ?oGa1 ?rpred0 //; split. + rewrite rpredD ?Ztau1T ?(mem_zchar T1zeta) // rpredB ?rpred1 //. + by rewrite Dade_vchar // zchar_split ZbetaT0. + rewrite /cfReal -subr_eq0 opprD opprB rmorphD rmorphB rmorph1 /= addrACA. + rewrite !addrA subrK -Dade_aut -linearB /= -/tauT rmorphB opprB /=. + rewrite -prTIred_aut aut_Iirr0 -/nu_ [sum in tauT sum]addrC addrA subrK. + rewrite -Dtau1T; last first. + by rewrite (zchar_onS _ (seqInd_sub_aut_zchar _ _ _)) // setSD ?der_sub. + rewrite raddfB -addrA addrC addrA subrK subr_eq0. + by rewrite (cfConjC_Dade_coherent cohT1) ?mFT_odd ?irrT1. +have [Y T1_Y [X [defGa oYX oXT1]]] := orthogonal_split (map tau1T calT1) Gamma. +apply: ler_trans (lb_Ga X Y _ _ _); first 1 last; rewrite 1?addrC //. +- by rewrite cfdotC oYX conjC0. +- by apply/orthoPl=> eta Weta; rewrite (span_orthogonal oT1eta) // memv_span. +have ->: v.-1 = (p * size calT1)%N; last rewrite mulKn ?prime_gt0 //. + rewrite [p](index_sdprod defT); have isoV := sdprod_isog defQV. + rewrite [v](card_isog isoV) -card_Iirr_abelian -?(isog_abelian isoV) //. + rewrite -(card_imset _ (can_inj (mod_IirrK nsQQV))) (cardD1 0) /=. + rewrite -{1}(mod_Iirr0 QV Q) mem_imset //=. + rewrite (size_irr_subseq_seqInd _ (subseq_refl _)) //=. + apply: eq_card => s; rewrite !inE mem_seqInd ?gFnormal // !inE subGcfker. + congr (_ && _); apply/idP/idP=> [/imsetP[r _ ->] | kerQs]. + by rewrite mod_IirrE ?cfker_mod. + by rewrite -(quo_IirrK nsQQV kerQs) mem_imset. +have o1T1: orthonormal (map tau1T calT1). + rewrite map_orthonormal ?(sub_orthonormal irrT1) ?seqInd_uniq //. + exact: irr_orthonormal. +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. +Qed. +Let Ttype2 := FTtypeP_min_typeII. + +(* These declarations correspond to Hypothesis (14.10). *) +Variables (M : {group gT}) (tau1M : {additive 'CF(M) -> 'CF(G)}) (psi : 'CF(M)). +Hypothesis maxNV_M : M \in 'M('N(V)). + +Local Notation "` 'M'" := (gval M) (at level 0, only parsing). +Local Notation K := `M`_\F%G. +Local Notation "` 'K'" := `M`_\F%g (at level 0, format "` 'K'") : group_scope. + +(* Consequences of the above. *) +Hypotheses (maxM : M \in 'M) (sNVM : 'N(V) \subset M). +Hypotheses (frobM : [Frobenius M with kernel K]) (Mtype1 : FTtype M == 1%N). + +Let calM := seqIndD K M K 1. +Local Notation tauM := (FT_DadeF maxM). +Let nsKM : K <| M. Proof. exact: gFnormal. Qed. +Let irrM : {subset calM <= irr M}. Proof. exact: FTtype1_Ind_irr. Qed. + +Hypothesis cohM : coherent_with calM M^# tauM tau1M. +Hypotheses (Mpsi : psi \in calM) (psi1 : psi 1%g = #|M : K|%:R). + +Let betaM := 'Ind[M, K] 1 - psi. + +Let pairTS : typeP_pair T S xdefW. Proof. exact: typeP_pair_sym pairST. Qed. + +Let pq : algC := (p * q)%:R. +Let h := #|H|. + +(* This is the first (and main) part of Peterfalvi (14.11). *) +Let defK : `K = V. +Proof. +pose e := #|M : K|; pose k := #|K|; apply: contraTeq isT => notKV. +have [_ sVK defM] := FTtypeII_support_facts maxT TtypeP Ttype2 pairTS maxNV_M. +have ltVK: V \proper K by rewrite properEneq eq_sym notKV. +have e_dv_k1: e %| k.-1 := Frobenius_ker_dvd_ker1 frobM. +have [e_lepq regKW2]: (e <= p * q)%N /\ semiregular K W2. + case: defM => [|[y Py]] defM; rewrite /e -(index_sdprod defM). + have /Frobenius_reg_ker regHW1 := set_Frobenius_compl defM frobM. + by rewrite leq_pmulr ?cardG_gt0. + have /Frobenius_reg_ker regHW21y := set_Frobenius_compl defM frobM. + split; last exact: semiregularS (joing_subl _ _) regHW21y. + suffices /normP <-: y \in 'N(W2). + by rewrite -conjYg cardJg (dprodWY xdefW) -(dprod_card xdefW). + have cPP: abelian P by have [_ [/and3P[]]] := FTtypeP_facts maxS StypeP. + have sW2P: W2 \subset P by have [_ _ _ []] := StypeP. + by rewrite (subsetP _ y Py) // sub_abelian_norm. +(* This is (14.11.1). *) +have{regKW2} [lb_k lb_k1e_v]: (2 * p * v < k /\ v.-1 %/ p < k.-1 %/ e)%N. + have /dvdnP[x Dk]: v %| k := cardSg sVK. + have lb_x: (p.*2 < x)%N. + have x_gt1: (1 < x)%N. + by rewrite -(ltn_pmul2r (cardG_gt0 V)) -Dk mul1n proper_card. + have x_gt0 := ltnW x_gt1; rewrite -(prednK x_gt0) ltnS -subn1. + rewrite dvdn_leq ?subn_gt0 // -mul2n Gauss_dvd ?coprime2n ?mFT_odd //. + rewrite dvdn2 odd_sub // (dvdn_odd _ (mFT_odd K)) -/k ?Dk ?dvdn_mulr //=. + rewrite -eqn_mod_dvd // -[x]muln1 -modnMmr. + have nVW2: W2 \subset 'N(V) by have [_ []] := TtypeP. + have /eqP{1} <-: (v == 1 %[mod p]). + rewrite eqn_mod_dvd ?cardG_gt0 // subn1 regular_norm_dvd_pred //. + exact: semiregularS regKW2. + rewrite modnMmr -Dk /k eqn_mod_dvd // subn1 regular_norm_dvd_pred //. + by rewrite (subset_trans (subset_trans nVW2 sNVM)) ?gFnorm. + have lb_k: (2 * p * v < k)%N by rewrite mul2n Dk ltn_pmul2r ?cardG_gt0. + split=> //; rewrite ltn_divLR ?cardG_gt0 // divn_mulAC ?prednK ?cardG_gt0 //. + rewrite leq_divRL ?indexg_gt0 // (leq_trans (leq_mul (leqnn v) e_lepq)) //. + rewrite mulnA mulnAC leq_mul // -ltnS prednK ?cardG_gt0 //. + apply: leq_ltn_trans lb_k; rewrite mulnC leq_mul // ltnW ?(leq_trans ltqp) //. + by rewrite mul2n -addnn leq_addl. +have lb_k1e_u := ltn_trans v1p_gt_u1q lb_k1e_v; have irr_psi := irrM Mpsi. +have Mgt1: (1 < size calM)%N by apply: seqInd_nontrivial Mpsi; rewrite ?mFT_odd. +(* This is (14.11.2). *) +have [] // := FTtype2_support_coherence TtypeP StypeP cohM Mpsi. +rewrite -/e -/p -/q mulnC /= => De [nb [chi Dchi]]. +rewrite cycTIiso_irrelC -/sigma -/betaM => DbetaM. +pose ddMK := FT_DadeF_hyp maxM; pose AM := Dade_support ddMK. +have defAM: AM = 'A~(M) by rewrite FTsupp_Frobenius -?FT_DadeF_supportE. +pose ccG A := class_support A G. +pose G0 := ~: ('A~(M) :|: ccG What :|: ccG P^# :|: ccG Q^#). +have sW2P: W2 \subset P by have [_ _ _ []] := StypeP. +have sW1Q: W1 \subset Q by have [_ _ _ []] := TtypeP. +(* This is (14.11.3). *) +have lbG0 g: g \in G0 -> 1 <= `|tau1M psi g| ^+ 2. + rewrite !inE ?expr_ge1 ?normr_ge0 // => /norP[/norP[/norP[AM'g W'g P'g Q'g]]]. + have{W'g} /coprime_typeP_Galois_core-co_p_g: g \notin ccG W^#. + apply: contra W'g => /imset2P[x y /setD1P[ntx Wx] Gy Dg]. + rewrite Dg mem_imset2 // !inE Wx andbT; apply/norP; split. + by apply: contra Q'g => /(subsetP sW1Q)?; rewrite Dg mem_imset2 ?inE ?ntx. + by apply: contra P'g => /(subsetP sW2P)Px; rewrite Dg mem_imset2 ?inE ?ntx. + have{AM'g} betaMg0: tauM betaM g = 0. + by apply: cfun_on0 AM'g; rewrite -defAM Dade_cfunS. + suffices{betaMg0}: 1 <= `|(\sum_ij (-1) ^+ nb ij *: sigma 'chi_ij) g|. + rewrite -[\sum_i _](subrK chi) -DbetaM !cfunE betaMg0 add0r. + case: Dchi => -> //; rewrite cfunE normrN. + by rewrite -(cfConjC_Dade_coherent cohM) ?mFT_odd ?cfunE ?norm_conjC. + have{co_p_g} Zeta_g ij: sigma 'chi_ij g \in Cint. + apply/Cint_cycTIiso_coprime/(coprime_dvdr (cforder_lin_char_dvdG _)). + by apply: irr_cyclic_lin; have [] := ctiWG. + rewrite -(dprod_card defW) coprime_mulr. + by apply/andP; split; [apply: co_p_g galT _ | apply: co_p_g galS _]. + rewrite sum_cfunE norm_Cint_ge1 ?rpred_sum // => [ij _|]. + by rewrite cfunE rpredMsign. + set a := \sum_i _; suffices: (a == 1 %[mod 2])%C. + by apply: contraTneq=> ->; rewrite (eqCmod_nat 2 0 1). + have signCmod2 n ij (b := sigma 'chi_ij g): ((-1) ^+ n * b == b %[mod 2])%C. + rewrite -signr_odd mulr_sign eqCmod_sym; case: ifP => // _. + by rewrite -(eqCmodDl _ b) subrr -[b + b](mulr_natr b 2) eqCmodMl0 /b. + rewrite -[1]addr0 [a](bigD1 0) {a}//= cfunE eqCmodD //. + by rewrite (eqCmod_trans (signCmod2 _ _)) // irr0 cycTIiso1 cfun1E inE. + rewrite (partition_big_imset (fun ij => [set ij; conjC_Iirr ij])) /= eqCmod0. + apply: rpred_sum => _ /=/imsetP[ij /negPf nz_ij ->]. + rewrite (bigD1 ij) /=; last by rewrite unfold_in nz_ij eqxx. + rewrite (big_pred1 (conjC_Iirr ij)) => [|ij1 /=]; last first. + rewrite unfold_in eqEsubset !subUset !sub1set !inE !(eq_sym ij). + rewrite !(can_eq (@conjC_IirrK _ _)) (canF_eq (@conjC_IirrK _ _)). + rewrite -!(eq_sym ij1) -!(orbC (_ == ij)) !andbb andbAC -andbA. + rewrite andb_orr andNb andbA andb_idl // => /eqP-> {ij1}. + rewrite conjC_Iirr_eq0 nz_ij -(inj_eq irr_inj) conjC_IirrE. + by rewrite odd_eq_conj_irr1 ?mFT_odd // irr_eq1 nz_ij. + rewrite -signr_odd -[odd _]negbK signrN !cfunE mulNr addrC. + apply: eqCmod_trans (signCmod2 _ _) _. + by rewrite eqCmod_sym conjC_IirrE -cfAut_cycTIiso cfunE conj_Cint. +have cardG_D1 R: #|R^#| = #|R|.-1 by rewrite [#|R|](cardsD1 1%g) group1. +pose rho := invDade ddMK; pose nG : algC := #|G|%:R. +pose sumG0 := \sum_(g in G0) `|tau1M psi g| ^+ 2. +pose sumG0_diff := sumG0 - (#|G0| + #|ccG What| + #|ccG P^#| + #|ccG Q^#|)%:R. +have ub_rho: '[rho (tau1M psi)] <= k.-1%:R / #|M|%:R - nG^-1 * sumG0_diff. + have NtauMpsi: '[tau1M psi] = 1. + by have [[Itau1 _] _] := cohM; rewrite Itau1 ?mem_zchar //= irrWnorm. + rewrite ler_subr_addl -subr_le0 -addrA. + have ddM_ i j: i != j :> 'I_1 -> [disjoint AM & AM] by rewrite !ord1. + apply: ler_trans (Dade_cover_inequality ddM_ NtauMpsi); rewrite -/nG -/AM. + rewrite !big_ord1 cardG_D1 ler_add2r ler_pmul2l ?invr_gt0 ?gt0CG //= defAM. + rewrite setTD ler_add ?ler_opp2 ?leC_nat //; last first. + do 3!rewrite -?addnA -cardsUI ?addnA (leq_trans _ (leq_addr _ _)) //. + by rewrite subset_leq_card // -setCD setCS -!setUA subDset setUC. + rewrite (big_setID G0) /= (setIidPr _) ?setCS -?setUA ?subsetUl // ler_addl. + by apply: sumr_ge0 => g _; rewrite ?exprn_ge0 ?normr_ge0. +have lb_rho: 1 - pq / k%:R <= '[rho (tau1M psi)]. + have [_] := Dade_Ind1_sub_lin cohM Mgt1 irr_psi Mpsi psi1; rewrite -/e -/k. + rewrite odd_Frobenius_index_ler ?mFT_odd // => -[_ _ [|/(ler_trans _)->] //]. + by rewrite ler_add2l ler_opp2 ler_pmul2r ?invr_gt0 ?gt0CG // leC_nat. +have{rho sumG0 sumG0_diff ub_rho lb_rho} []: + ~ pq / k%:R + 2%:R / pq + (u * q)%:R^-1 + (v * p)%:R^-1 < p%:R^-1 + q%:R^-1. +- rewrite ler_gtF // -!addrA -ler_subl_addl -ler_subr_addl -(ler_add2l 1). + apply: ler_trans {ub_rho lb_rho}(ler_trans lb_rho ub_rho) _. + rewrite /sumG0_diff -!addnA natrD opprD addrA mulrBr opprB addrA. + rewrite ler_subl_addr ler_paddr //. + by rewrite mulr_ge0 ?invr_ge0 ?ler0n // subr_ge0 -sumr_const ler_sum. + rewrite mulrDl -!addrA addrCA [1 + _]addrA [_ + (_ - _)]addrA ler_add //. + rewrite -(Lagrange (normal_sub nsKM)) natrM invfM mulrA -/k -/e /pq -De. + rewrite ler_pmul2r ?invr_gt0 ?gt0CiG // ler_pdivr_mulr ?gt0CG //. + by rewrite mul1r leC_nat leq_pred. + rewrite [1 + _ + _]addrA addrAC !natrD !mulrDr !ler_add //; first 1 last. + + exact: (FTtype2_cc_core_ler StypeP). + + exact: (FTtype2_cc_core_ler TtypeP). + have [_ _ /card_support_normedTI->] := ctiWG. + rewrite natrM natf_indexg ?subsetT // mulrCA mulKf ?neq0CG // card_cycTIset. + rewrite mulnC -(dprod_card xdefW) /pq !natrM -!subn1 !natrB // -/p -/q invfM. + rewrite mulrACA !mulrBl ?divff ?neq0CG // !mul1r mulrBr mulr1 opprB. + by rewrite addrACA -opprB opprK. +rewrite -!addrA ler_lt_add //; last first. + pose q2 : algC := (q ^ 2)%:R. + apply: ltr_le_trans (_ : 2%:R / q2 + (2%:R * q2)^-1 *+ 2 <= _); last first. + rewrite addrC -[_ *+ 2]mulr_natl invfM mulVKf ?pnatr_eq0 //. + rewrite mulr_natl -mulrS -mulr_natl [q2]natrM. + by rewrite ler_pdivr_mulr ?mulr_gt0 ?gt0CG // mulKf ?neq0CG ?leC_nat. + rewrite -natrM !addrA ltr_add ?(FTtypeP_complV_ltr TtypeP) 1?ltnW //. + rewrite ltr_add ?(FTtypeP_complV_ltr StypeP) // /pq mulnC /q2 !natrM !invfM. + by rewrite !ltr_pmul2l ?ltf_pinv ?invr_gt0 ?qualifE ?gt0CG ?ltr0n ?ltr_nat. +rewrite ler_pdivr_mulr ?ler_pdivl_mull ?gt0CG // -natrM leC_nat. +apply: leq_trans lb_k; rewrite leqW // mulnAC mulnC leq_mul //. +have [[_ _ frobVW2 _] _ _ _ _] := FTtypeP_facts maxT TtypeP. +rewrite -[(p * q)%N]mul1n leq_mul // (leq_trans _ (leq_pred v)) // dvdn_leq //. + by rewrite -subn1 subn_gt0 cardG_gt1; have[] := Frobenius_context frobVW2. +rewrite Gauss_dvd ?prime_coprime ?(dvdn_prime2 pr_p pr_q) ?gtn_eqF //. +rewrite (Frobenius_dvd_ker1 frobVW2) /= oV /nV predn_exp. +rewrite -(subnKC qgt2) -(ltn_predK pgt2) mulKn // subnKC //. +by rewrite big_ord_recl dvdn_sum // => i _; rewrite expnS dvdn_mulr. +Qed. + +(* This is the first part of Peterfalvi (14.11). *) +Let indexMK : #|M : K| = (p * q)%N. +Proof. +have [_ _ [defM|]] := FTtypeII_support_facts maxT TtypeP Ttype2 pairTS maxNV_M. + have:= Ttype2; rewrite (mmax_max maxM (mmax_proper maxT)) ?(eqP Mtype1) //. + rewrite -(sdprodW (Ptype_Fcore_sdprod TtypeP)) -defK (sdprodWY defM). + exact: mulG_subr. +case=> y Py /index_sdprod <-; rewrite (dprod_card xdefW) -(dprodWY xdefW). +suffices /normP {1}<-: y \in 'N(W2) by rewrite -conjYg cardJg. +have cPP: abelian P by have [_ [/and3P[]]] := FTtypeP_facts maxS StypeP. +by rewrite (subsetP (sub_abelian_norm cPP _)) //; have [_ _ _ []] := StypeP. +Qed. + +(* This is Peterfalvi (14.12), and also (14.13) since we have already proved *) +(* the negation of Theorem (14.2). *) +Let not_MG_L : (L : {set gT}) \notin M :^: G. +Proof. +rewrite orbit_sym; apply: contra not_charUH => /imsetP[z _ /= defLz]. +rewrite sub_cyclic_char // -(cyclicJ _ z) -FcoreJ -defLz defK. +have [_ _ [cycV _ _]] := typeP_Galois_P maxT (FTtype5_exclusion maxT) galT. +rewrite Ptype_Fcompl_kernel_trivial // in cycV. +by rewrite -(isog_cyclic (quotient1_isog V)) in cycV. +Qed. + +(* This is Peterfalvi (14.14). *) +Let LM_cases : + '[tauM betaM, tau1L phi] != 0 /\ h.-1%:R / pq <= pq - 1 + \/ '[tauL betaL, tau1M psi] != 0 /\ q = 3 /\ p = 5. +Proof. +have [irr_phi irr_psi] := (irrL Lphi, irrM Mpsi). +have:= Dade_sub_lin_nonorthogonal (mFT_odd _) _ cohM cohL _ Mpsi _ _ Lphi. +rewrite -/betaL -/betaM disjoint_Dade_FTtype1 //. +case=> //; set a := '[_, _] => nz_a; [left | right]; split=> //. + rewrite {1}/pq -indexLH /pq -indexMK. + by rewrite (coherent_FTtype1_core_ltr cohM cohL Mpsi Lphi) // orbit_sym. +have ub_v: v.-1%:R / pq <= pq - 1. + rewrite {1}/pq -indexMK /pq -indexLH /v -defK. + exact: (coherent_FTtype1_core_ltr cohL cohM Lphi Mpsi). +have{ub_v} ub_qp: (q ^ (p - 3) < p ^ 2)%N. + rewrite -(@ltn_pmul2l (q ^ 3)) ?expn_gt0 ?cardG_gt0 // -expnD subnKC //. + have: v.-1%:R < pq ^+ 2. + rewrite -ltr_pdivr_mulr ?ltr0n ?muln_gt0 ?cardG_gt0 //. + by rewrite (ler_lt_trans ub_v) // ltr_subl_addl -mulrS ltC_nat. + rewrite -natrX ltC_nat prednK ?cardG_gt0 // mulnC expnMn oV. + rewrite leq_divLR ?dvdn_pred_predX // mulnC -subn1 leq_subLR. + move/leq_ltn_trans->; rewrite // -addSn addnC -(leq_add2r (q ^ 2 * p ^ 2)). + rewrite addnAC -mulSnr prednK ?cardG_gt0 // mulnA leq_add2l -expnMn. + by rewrite (ltn_sqr 1) (@ltn_mul 1 1) ?prime_gt1. +have q3: q = 3. + apply/eqP; rewrite eqn_leq qgt2 -ltnS -(odd_ltn 5) ?mFT_odd // -ltnS. + rewrite -(ltn_exp2l _ _ (ltnW pgt2)) (leq_trans qp1_gt_pq1) // ltnW //. + by rewrite -{1}(subnK pgt2) -addnS expnD (expnD p 2 4) ltn_mul ?ltn_exp2r. +split=> //; apply/eqP; rewrite eqn_leq -ltnS andbC. +rewrite (odd_geq 5) -1?(odd_ltn 7) ?mFT_odd //= doubleS -{1}q3 ltqp /=. +move: ub_qp; rewrite 2!ltnNge q3; apply: contra. +elim: p => // x IHx; rewrite ltnS leq_eqVlt => /predU1P[<- // | xgt6]. +apply: (@leq_trans (3 * x ^ 2)); last first. + rewrite subSn ?(leq_trans _ xgt6) //. + by rewrite [rhs in (_ <= rhs)%N]expnS leq_mul ?IHx. +rewrite -addn1 sqrnD -addnA (mulSn 2) leq_add2l muln1. +rewrite (@leq_trans (2 * (x * 7))) ?leq_mul //. +by rewrite mulnCA (mulnDr x 12 2) mulnC leq_add2r -(subnKC xgt6). +Qed. + +(* This is Peterfalvi (14.15). *) +Let oU : u = nU. +Proof. +case: ifP (card_FTtypeP_Galois_compl maxS galS) => // p1modq oU. +pose x := #|H : U|; rewrite -/u -/nU -/p -/q in p1modq oU. +have DnU: (q * u)%N = nU. + rewrite mulnC oU divnK //. + by have [_ ->] := FTtypeP_primes_mod_cases maxS StypeP. +have oH: h = (u * x)%N by rewrite Lagrange. +have xmodp: x = q %[mod p]. + have hmodp: h = 1 %[mod p]. + apply/eqP; rewrite eqn_mod_dvd ?cardG_gt0 // subn1. + apply: dvdn_trans (Frobenius_ker_dvd_ker1 frobL). + have [y _ /index_sdprod <-] := defL. + by rewrite -[p](cardJg _ y) cardSg ?joing_subr. + rewrite -[q]muln1 -modnMmr -hmodp modnMmr oH mulnA DnU -modnMml. + suffices ->: nU = 1 %[mod p] by rewrite modnMml mul1n. + rewrite /nU predn_exp mulKn; last by rewrite -(subnKC pgt2). + apply/eqP; rewrite -(ltn_predK qgt2) big_ord_recl eqn_mod_dvd ?subn1 //=. + by apply: dvdn_sum => i _; rewrite expnS dvdn_mulr. +have{xmodp} [n Dx]: {n | x = q + n * p}%N. + by exists (x %/ p); rewrite -(modn_small ltqp) addnC -xmodp -divn_eq. +have nmodq: n = 1 %[mod q]. + have [y _ defLy] := defL; have [_ _ /joing_subP[nHW1 _] _] := sdprodP defLy. + have regHW1: semiregular H W1. + have /Frobenius_reg_ker := set_Frobenius_compl defLy frobL. + by apply: semiregularS; rewrite ?joing_subl. + have hmodq: h = 1 %[mod q]. + apply/eqP; rewrite eqn_mod_dvd ?cardG_gt0 // subn1. + exact: regular_norm_dvd_pred regHW1. + have umodq: u = 1 %[mod q]. + apply/eqP; rewrite eqn_mod_dvd ?cardG_gt0 // subn1. + apply: regular_norm_dvd_pred; first by have [_ []] := StypeP. + exact: semiregularS regHW1. + rewrite -hmodq oH -modnMml umodq modnMml mul1n Dx modnDl. + by rewrite -modnMmr (eqP p1modq) modnMmr muln1. +have{n nmodq Dx} lb_x: (q + q.+1 * p <= x)%N. + rewrite (divn_eq n q) nmodq (modn_small (ltnW qgt2)) addn1 in Dx. + rewrite Dx leq_add2l leq_mul // ltnS leq_pmull // lt0n. + have: odd x by rewrite (dvdn_odd (dvdn_indexg _ _)) ?mFT_odd. + by rewrite Dx odd_add odd_mul !mFT_odd; apply: contraNneq => ->. +have lb_h: (p ^ q < h)%N. + rewrite (@leq_trans (p * nU)) //; last first. + rewrite -DnU oH mulnA mulnC leq_mul // (leq_trans _ lb_x) //. + by rewrite mulSn addnA mulnC leq_addl. + rewrite /nU predn_exp mulKn; last by rewrite -(subnKC pgt2). + rewrite -(subnKC (ltnW qgt2)) subn2 big_ord_recr big_ord_recl /=. + by rewrite -add1n !mulnDr -!expnS -addnA leq_add ?leq_addl // cardG_gt0. +have ub_h: (h <= p ^ 2 * q ^ 2)%N. + have [[_ ub_h] | [_ [q3 p5]]] := LM_cases; last by rewrite q3 p5 in p1modq. + rewrite -expnMn -(ltn_predK lb_h) -ltC_nat natrM -/pq. + rewrite -ltr_pdivr_mulr ?ltr0n ?muln_gt0 ?cardG_gt0 //. + by rewrite (ler_lt_trans ub_h) // ltr_subl_addl -mulrS ltC_nat. +have{lb_h} lb_q2: (p ^ q.-2 < q ^ 2)%N. + rewrite -(@ltn_pmul2l (p ^ 2)) ?expn_gt0 ?cardG_gt0 // (leq_trans _ ub_h) //. + by rewrite -subn2 -expnD subnKC // ltnW. +have q3: q = 3. + apply/eqP; rewrite eqn_leq qgt2 -(subnKC (ltnW qgt2)) subn2 ltnS. + by rewrite -(ltn_exp2l _ _ (ltnW pgt2)) (ltn_trans lb_q2) ?ltn_exp2r. +have{lb_q2 p1modq} p7: p = 7. + suff: p \in [seq n <- iota 4 5 | prime n & n == 1 %[mod 3]] by case/predU1P. + by rewrite mem_filter pr_p mem_iota -q3 p1modq ltqp; rewrite q3 in lb_q2 *. +rewrite oH mulnC oU /nU q3 p7 -leq_divRL //= in ub_h lb_x. +by have:= leq_trans lb_x ub_h. +Qed. + +(* This is Peterfalvi (14.16), the last step towards the final contradiction. *) +Let defH : `H = U. +Proof. +pose x := #|H : U|; have oH: h = (u * x)%N by rewrite Lagrange. +apply/eqP/idPn; rewrite eqEsubset sUH andbT -indexg_gt1 -/x => xgt1. +have hmodpq: h = 1 %[mod p * q]. + apply/eqP; rewrite eqn_mod_dvd ?cardG_gt0 // -indexLH subn1. + exact: Frobenius_ker_dvd_ker1. +have [[_ _ frobUW1 _] _ _ _ _] := FTtypeP_facts maxS StypeP. +have /eqP umodpq: u == 1 %[mod p * q]. + rewrite chinese_remainder ?prime_coprime ?dvdn_prime2 ?(gtn_eqF ltqp) //. + rewrite !eqn_mod_dvd ?cardG_gt0 // subn1 (Frobenius_dvd_ker1 frobUW1). + rewrite oU /nU predn_exp mulKn; last by rewrite -(subnKC pgt2). + by rewrite -(ltn_predK qgt2) big_ord_recl dvdn_sum //= => i; rewrite dvdn_exp. +have{hmodpq} lb_x: (p * q < x)%N. + rewrite -(subnKC (ltnW xgt1)) ltnS dvdn_leq ?subn_gt0 //. + by rewrite -eqn_mod_dvd 1?ltnW // -hmodpq oH -modnMml umodpq modnMml mul1n. +have [[_ ub_h] | [nz_a [q3 p5]]] := LM_cases. + have /idPn[]: (p * q < u)%N. + have ugt1: (1 < u)%N. + by rewrite cardG_gt1; have [] := Frobenius_context frobUW1. + rewrite -(subnKC (ltnW ugt1)) ltnS dvdn_leq ?subn_gt0 //. + by rewrite -eqn_mod_dvd ?umodpq 1?ltnW. + rewrite -leqNgt -(leq_pmul2r (indexg_gt0 L H)) indexLH. + apply: (@leq_trans h.-1). + by rewrite -ltnS prednK ?cardG_gt0 // oH ltn_pmul2l ?cardG_gt0. + rewrite -indexLH -leC_nat natrM -ler_pdivr_mulr ?gt0CiG // indexLH -/pq. + by rewrite (ler_trans ub_h) // ler_subl_addl -mulrS leC_nat ltnW. +have lb_h1e_v: (v.-1 %/ p < h.-1 %/ #|L : H|)%N. + rewrite -(@ltn_pmul2l u) ?cardG_gt0 // -oH oU /nU q3 p5 /= in lb_x. + rewrite -(ltn_subRL 1) /= subn1 in lb_x. + by rewrite leq_divRL ?indexG_gt0 // oV /nV indexLH q3 p5 (leq_trans _ lb_x). +have oLM: orthogonal (map tau1L calL) (map tau1M calM). + by rewrite orthogonal_sym coherent_FTtype1_ortho. +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. + 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. +Qed. + +Lemma FTtype2_exclusion : False. +Proof. by have /negP[] := not_charUH; rewrite /= defH char_refl. Qed. + +End Fourteen. + +Lemma no_minSimple_odd_group (gT : minSimpleOddGroupType) : False. +Proof. +have [/forall_inP | [S [T [_ W W1 W2 defW pairST]]]] := FTtypeP_pair_cases gT. + exact/negP/not_all_FTtype1. +have xdefW: W2 \x W1 = W by rewrite dprodC. +have pairTS := typeP_pair_sym xdefW pairST. +pose p := #|W2|; pose q := #|W1|. +have p'q: q != p. + have [[[ctiW _ _] _ _ _ _] /mulG_sub[sW1W sW2W]] := (pairST, dprodW defW). + have [cycW _ _] := ctiW; apply: contraTneq (cycW) => eq_pq. + rewrite (cyclic_dprod defW) ?(cyclicS _ cycW) // -/q eq_pq. + by rewrite /coprime gcdnn -trivg_card1; have [] := cycTI_nontrivial ctiW. +without loss{p'q} ltqp: S T W1 W2 defW xdefW pairST pairTS @p @q / q < p. + move=> IH_ST; rewrite neq_ltn in p'q. + by case/orP: p'q; [apply: (IH_ST S T) | apply: (IH_ST T S)]. +have [[_ maxS maxT] _ _ _ _] := pairST. +have [[U StypeP] [V TtypeP]] := (typeP_pairW pairST, typeP_pairW pairTS). +have Stype2: FTtype S == 2 := FTtypeP_max_typeII maxS StypeP ltqp. +have Ttype2: FTtype T == 2 := FTtypeP_min_typeII maxS maxT StypeP TtypeP ltqp. +have /mmax_exists[L maxNU_L]: 'N(U) \proper setT. + have [[_ ntU _ _] cUU _ _ _] := compl_of_typeII maxS StypeP Stype2. + by rewrite mFT_norm_proper // mFT_sol_proper abelian_sol. +have /mmax_exists[M maxNV_M]: 'N(V) \proper setT. + have [[_ ntV _ _] cVV _ _ _] := compl_of_typeII maxT TtypeP Ttype2. + by rewrite mFT_norm_proper // mFT_sol_proper abelian_sol. +have [[maxL sNU_L] [maxM sNV_M]] := (setIdP maxNU_L, setIdP maxNV_M). +have [frobL sUH _] := FTtypeII_support_facts maxS StypeP Stype2 pairST maxNU_L. +have [frobM _ _] := FTtypeII_support_facts maxT TtypeP Ttype2 pairTS maxNV_M. +have Ltype1 := FT_Frobenius_type1 maxL frobL. +have Mtype1 := FT_Frobenius_type1 maxM frobM. +have [tau1L cohL] := FTtype1_coherence maxL Ltype1. +have [tau1M cohM] := FTtype1_coherence maxM Mtype1. +have [phi Lphi phi1] := FTtype1_ref_irr maxL. +have [psi Mpsi psi1] := FTtype1_ref_irr maxM. +exact: (FTtype2_exclusion pairST maxS maxT StypeP TtypeP ltqp + maxNU_L sNU_L sUH frobL Ltype1 cohL Lphi phi1 + maxNV_M sNV_M frobM Mtype1 cohM Mpsi psi1). +Qed. + +Theorem Feit_Thompson (gT : finGroupType) (G : {group gT}) : + odd #|G| -> solvable G. +Proof. exact: (minSimpleOdd_ind no_minSimple_odd_group). Qed. + +Theorem simple_odd_group_prime (gT : finGroupType) (G : {group gT}) : + odd #|G| -> simple G -> prime #|G|. +Proof. exact: (minSimpleOdd_prime no_minSimple_odd_group). Qed. + + |
