aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/odd_order/PFsection11.v
diff options
context:
space:
mode:
authorEnrico Tassi2018-04-17 16:57:13 +0200
committerEnrico Tassi2018-04-17 16:57:13 +0200
commiteaa90cf9520e43d0b05fc6431a479e6b9559ef0e (patch)
tree8499953a468a8d8be510dd0d60232cbd8984c1ec /mathcomp/odd_order/PFsection11.v
parentc1ec9cd8e7e50f73159613c492aad4c6c40bc3aa (diff)
move odd_order to its own repository
Diffstat (limited to 'mathcomp/odd_order/PFsection11.v')
-rw-r--r--mathcomp/odd_order/PFsection11.v1203
1 files changed, 0 insertions, 1203 deletions
diff --git a/mathcomp/odd_order/PFsection11.v b/mathcomp/odd_order/PFsection11.v
deleted file mode 100644
index 3635618..0000000
--- a/mathcomp/odd_order/PFsection11.v
+++ /dev/null
@@ -1,1203 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg poly finset center.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action finalg zmodp.
-From mathcomp
-Require Import gfunctor gproduct cyclic commutator gseries nilpotent pgroup.
-From mathcomp
-Require Import sylow hall abelian maximal frobenius.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation mxabelem vector.
-From mathcomp
-Require Import BGsection1 BGsection3 BGsection7 BGsection15 BGsection16.
-From mathcomp
-Require Import ssrnum ssrint algC classfun character inertia vcharacter.
-From mathcomp
-Require Import PFsection1 PFsection2 PFsection3 PFsection4 PFsection5.
-From mathcomp
-Require Import PFsection6 PFsection7 PFsection8 PFsection9 PFsection10.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 11: Maximal subgroups of Types *)
-(* III and IV. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory FinRing.Theory Num.Theory.
-
-Section Eleven.
-
-(* This is Peterfalvi (11.1). *)
-Lemma lbound_expn_odd_prime p q :
- odd p -> odd q -> prime p -> prime q -> p != q -> 4 * q ^ 2 + 1 < p ^ q.
-Proof.
-move=> odd_p odd_q pr_p pr_q p_neq_q.
-have{pr_p pr_q} [pgt2 qgt2] : 2 < p /\ 2 < q by rewrite !odd_prime_gt2.
-have [qlt5 | qge5 {odd_q qgt2 p_neq_q}] := ltnP q 5.
- have /eqP q3: q == 3 by rewrite eqn_leq qgt2 andbT -ltnS -(odd_ltn 5).
- apply: leq_trans (_ : 5 ^ q <= p ^ q); first by rewrite q3.
- by rewrite leq_exp2r // odd_geq // ltn_neqAle pgt2 eq_sym -q3 p_neq_q.
-apply: leq_trans (_ : 3 ^ q <= p ^ q); last by rewrite -(subnKC qge5) leq_exp2r.
-elim: q qge5 => // q IHq; rewrite ltnS leq_eqVlt => /predU1P[<- // | qge5].
-rewrite (expnS 3); apply: leq_trans {IHq}(leq_mul (leqnn 3) (IHq qge5)).
-rewrite -!addnS mulnDr leq_add // mulnCA leq_mul // !(mul1n, mulSnr).
-by rewrite -addn1 sqrnD muln1 -(subnKC qge5) !leq_add ?leq_mul.
-Qed.
-
-Local Open Scope ring_scope.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types H K L N P Q R S T U V W : {group gT}.
-
-Variables M U W W1 W2 : {group gT}.
-Hypotheses (maxM : M \in 'M) (defW : W1 \x W2 = W) (MtypeP : of_typeP M U defW).
-Hypothesis notMtype2 : FTtype M != 2.
-
-Let notMtype5 : FTtype M != 5. Proof. exact: FTtype5_exclusion. Qed.
-Let notMtype1 : FTtype M != 1%N. Proof. exact: FTtypeP_neq1 MtypeP. Qed.
-Let Mtype34 : FTtype M \in pred2 3 4.
-Proof.
-by have:= FTtype_range M; rewrite -mem_iota !inE !orbA orbC 3?[_ == _](negPf _).
-Qed.
-Let Mtype_gt2 : (FTtype M > 2)%N. Proof. by case/pred2P: Mtype34 => ->. Qed.
-
-Local Notation H0 := (Ptype_Fcore_kernel MtypeP).
-Local Notation "` 'H0'" := (gval H0) (at level 0, only parsing) : group_scope.
-Local Notation "` 'M'" := (gval M) (at level 0, only parsing) : group_scope.
-Local Notation "` 'U'" := (gval U) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W'" := (gval W) (at level 0, only parsing) : group_scope.
-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 H := `M`_\F%G.
-Local Notation "` 'H'" := `M`_\F (at level 0) : group_scope.
-Local Notation HU := M^`(1)%G.
-Local Notation "` 'HU'" := `M^`(1)%g (at level 0) : group_scope.
-Local Notation U' := U^`(1)%G.
-Local Notation "` 'U''" := `U^`(1)%g (at level 0) : group_scope.
-Local Notation C := 'C_U(`H)%G.
-Local Notation "` 'C'" := 'C_`U(`H) (at level 0) : group_scope.
-Local Notation HC := (`H <*> `C)%G.
-Local Notation "` 'HC'" := (`H <*> `C) (at level 0) : group_scope.
-Local Notation H0C := (`H0 <*> `C)%G.
-Local Notation "` 'H0C'" := (`H0 <*> `C) (at level 0) : group_scope.
-Local Notation Hbar := (`H / `H0)%g.
-
-Local Notation S_ := (seqIndD HU M HU).
-Local Notation tau := (FT_Dade0 maxM).
-Local Notation R := (FTtypeP_coh_base maxM MtypeP).
-Local Notation V := (cyclicTIset defW).
-
-Let Mtype24 := compl_of_typeII_IV maxM MtypeP notMtype5.
-
-Let defMs : M`_\s = HU. Proof. exact: FTcore_type_gt2. Qed.
-Let defA1 : 'A1(M) = HU^#. Proof. by rewrite /= -defMs. Qed.
-Let defA : 'A(M) = HU^#. Proof. by rewrite FTsupp_eq1. Qed.
-Let sHU_A0 : HU^# \subset 'A0(M). Proof. by rewrite -defA FTsupp_sub0. Qed.
-
-Let calS := seqIndD HU M M`_\s 1.
-Let scohM : subcoherent calS tau R. Proof. exact: FTtypeP_subcoherent. Qed.
-Let scoh1 : subcoherent (S_ 1) tau R.
-Proof. by rewrite -{2}(group_inj defMs). Qed.
-
-Let p := #|W2|.
-Let pr_p : prime p. Proof. by have [] := FTtypeP_primes maxM MtypeP. Qed.
-Let ntW2 : W2 :!=: 1%g. Proof. by rewrite -cardG_gt1 prime_gt1. Qed.
-Let cycW2 : cyclic W2. Proof. exact: prime_cyclic. Qed.
-Let def_p : pdiv #|Hbar| = p. Proof. exact: typeIII_IV_core_prime. Qed.
-
-Let q := #|W1|.
-Let pr_q : prime q. Proof. by have [] := FTtypeP_primes maxM MtypeP. Qed.
-Let ntW1 : W1 :!=: 1%g. Proof. by rewrite -cardG_gt1 prime_gt1. Qed.
-Let cycW1 : cyclic W1. Proof. exact: prime_cyclic. Qed.
-
-Let defM : HU ><| W1 = M. Proof. by have [[]] := MtypeP. Qed.
-Let defHU : H ><| U = HU. Proof. by have [_ []] := MtypeP. Qed.
-
-Let nsHUM : HU <| M. Proof. exact: gFnormal. Qed.
-Let sHUM : HU \subset M. Proof. exact: gFsub. Qed.
-Let sHHU : H \subset HU. Proof. by have /mulG_sub[] := sdprodW defHU. Qed.
-Let sUHU : U \subset HU. Proof. by have /mulG_sub[] := sdprodW defHU. Qed.
-Let sUM : U \subset M. Proof. exact: subset_trans sUHU sHUM. Qed.
-
-Let coHUq : coprime #|HU| q.
-Proof. by rewrite (coprime_sdprod_Hall_r defM); have [[]] := MtypeP. Qed.
-Let coUq : coprime #|U| q. Proof. exact: coprimeSg coHUq. Qed.
-
-Let neq_pq : p != q.
-Proof.
-apply: contraTneq coHUq => <-; rewrite coprime_sym prime_coprime ?cardSg //.
-by rewrite -(typeP_cent_compl MtypeP) subsetIl.
-Qed.
-
-Let solHU : solvable HU. Proof. exact: solvableS sHUM (mmax_sol maxM). Qed.
-Let solH : solvable H. Proof. exact: solvableS sHHU solHU. Qed.
-
-Let ltM''HU : M^`(2)%g \proper HU.
-Proof. by rewrite (sol_der1_proper solHU) // -defMs FTcore_neq1. Qed.
-
-Let frobMtilde : [Frobenius M / M^`(2) = (HU / M^`(2)) ><| (W1 / M^`(2))].
-Proof.
-have [[_ _ _ _] _ _ [_ _ _ sW2M'' prHUW1 ] _] := MtypeP.
-by rewrite Frobenius_coprime_quotient ?gFnormal //; split=> // _ /prHUW1->.
-Qed.
-
-Let defHC : H \x C = HC.
-Proof.
-by have [defHC _ _ _] := typeP_context MtypeP; rewrite /= (dprodWY defHC).
-Qed.
-
-Let nC_UW1 : U <*> W1 \subset 'N(C).
-Proof.
-have /sdprodP[_ _ nHUW1 _] := Ptype_Fcore_sdprod MtypeP.
-by rewrite normsI ?norms_cent // join_subG normG; have [_ []] := MtypeP.
-Qed.
-
-Let nsCM : C <| M.
-Proof.
-rewrite /normal subIset ?sUM //= -{1}(sdprodW (Ptype_Fcore_sdprod MtypeP)).
-by rewrite mulG_subG cents_norm // centsC subsetIr.
-Qed.
-
-Let nsCU : C <| U. Proof. exact: normalS (subsetIl _ _) sUM nsCM. Qed.
-Let nsHC_M : HC <| M. Proof. by rewrite normalY ?gFnormal. Qed.
-Let sHC_HU : HC \subset HU. Proof. by rewrite join_subG sHHU subIset ?sUHU. Qed.
-Let nsHC_HU : HC <| HU. Proof. exact: normalS nsHC_M. Qed.
-
-Let chiefH0 : chief_factor M H0 H.
-Proof. by have [] := Ptype_Fcore_kernel_exists maxM MtypeP notMtype5. Qed.
-
-Let minHbar : minnormal Hbar (M / H0).
-Proof. exact: chief_factor_minnormal. Qed.
-
-Let abelHbar : p.-abelem Hbar.
-Proof.
-have solHbar : solvable (H / H0) by rewrite quotient_sol.
-have [_ _] := minnormal_solvable minHbar (subxx _) solHbar.
-by rewrite /is_abelem def_Ptype_factor_prime.
-Qed.
-
-Let sH0H : H0 \subset H.
-Proof. by have/andP[/maxgroupp/andP[/proper_sub]]:= chiefH0. Qed.
-
-Let nH0M: M \subset 'N(H0).
-Proof. by have /andP[/maxgroupp/andP[]] := chiefH0. Qed.
-
-Let nsH0H : H0 <| H.
-Proof. by rewrite /normal sH0H gFsub_trans. Qed.
-
-Let nsH0C_M : H0C <| M.
-Proof. by rewrite normalY // /normal ?(subset_trans sH0H) ?gFsub. Qed.
-
-Let defH0C : H0 \x C = H0C.
-Proof.
-have /dprodP[_ _ cHC tiHC] := defHC.
-by rewrite dprodEY ?(centsS sH0H) //; apply/trivgP; rewrite -tiHC setSI.
-Qed.
-
-(* Group-theoretic consequences of the coherence and non-coherence theorems *)
-(* of Sections 5, 9 and 10 for maximal subgroups of type III and IV. *)
-
-(* This is Peterfalvi (11.3). *)
-Lemma FTtype34_noncoherence : ~ coherent (S_ H0C) M^# tau.
-Proof.
-move=> cohH0C; suff: coherent (S_ 1) M^# tau by apply: FTtype345_noncoherence.
-have /mulG_sub[_ sW1M] := sdprodW defM.
-have [nsHHU _ _ nHU tiHU] := sdprod_context defHU.
-have sHM: H \subset M := gFsub _ _.
-have [sCM sH0C_M]: C \subset M /\ H0C \subset M by rewrite !normal_sub.
-have nH0_C := subset_trans sCM nH0M.
-have sH0C_HC: H0C \subset HC by apply: genS (setSU _ _).
-have defF: HC :=: 'F(M) by have [/dprodWY] := typeP_context MtypeP.
-have{defF} nilHC: nilpotent (HC / 1) by rewrite defF quotient_nil ?Fitting_nil.
-have /bounded_seqIndD_coherence-bounded_coh1 := scoh1.
-apply: bounded_coh1 nilHC cohH0C _; rewrite ?sub1G ?normal1 //.
-have[_ _ /= oHbar] := Ptype_Fcore_factor_facts maxM MtypeP notMtype5.
-rewrite -(index_sdprod defM) -divgS // -(dprod_card defHC) -(dprod_card defH0C).
-rewrite divnMr ?cardG_gt0 // divg_normal // oHbar def_p -/q.
-by rewrite lbound_expn_odd_prime ?mFT_odd.
-Qed.
-
-(* This is Peterfalvi (11.4). *)
-Lemma bounded_proper_coherent H1 :
- H1 <| M -> H1 \proper HU -> coherent (S_ H1) M^# tau ->
- (#|HU : H1| <= 2 * q * #|U : C| + 1)%N.
-Proof.
-move=> nsH1_M psH1_M' cohH1; have [nsHHU _ _ _ _] := sdprod_context defHU.
-suffices: #|HU : H1|%:R - 1 <= 2%:R * #|M : HC|%:R * sqrtC #|HC : HC|%:R :> algC.
- rewrite indexgg sqrtC1 mulr1 -leC_nat natrD -ler_subl_addr -mulnA natrM.
- congr (_ <= _ * _%:R); apply/eqP; rewrite -(eqn_pmul2l (cardG_gt0 HC)).
- rewrite Lagrange ?normal_sub // mulnCA -(dprod_card defHC) -mulnA mulnC.
- by rewrite Lagrange ?subsetIl // (sdprod_card defHU) (sdprod_card defM).
-apply/negP/(coherent_seqIndD_bound _ _ scoh1 _ _ _ FTtype34_noncoherence) => //.
-suffices /center_idP->: abelian (HC / H0C) by rewrite genS ?setSU.
-suffices /isog_abelian<-: Hbar \isog HC / H0C by apply: abelem_abelian abelHbar.
-by rewrite /= [`H0C]joingC quotient_sdprodr_isog ?(dprodWsdC defHC).
-Qed.
-
-(* This is Peterfalvi (11.5). *)
-Lemma FTtype34_der2 : M^`(2)%g = HC.
-Proof.
-have [defFM [_ not_cHU] _ _] := typeP_context MtypeP.
-have [_ sW1M _ _ tiHU_W1] := sdprod_context defM.
-have{defFM} sM''_HC: M^`(2)%g \subset HC.
- by rewrite -defHC defFM; have [_ _ []] := MtypeP.
-have scohM'': subcoherent (S_ M^`(2)) tau R.
- exact/(subset_subcoherent scoh1)/seqInd_conjC_subset1.
-have cohM'': coherent (S_ M^`(2)) M^# tau.
- apply: uniform_degree_coherence scohM'' _.
- apply: all_pred1_constant #|M : HU|%:R _ _; rewrite all_map.
- apply/allP=> _ /seqIndP[s /setDP[kerM'' _] ->] /=; rewrite inE in kerM''.
- by rewrite cfInd1 ?gFsub // lin_char1 ?mulr1 ?lin_irr_der1.
-have ubHC: (#|HC : M^`(2)| < 2 * q + 1)%N.
- rewrite -(ltn_pmul2r (indexg_gt0 U C)) mulnDl mul1n.
- apply: leq_ltn_trans (_ : 2 * q * #|U : C| + 1 < _)%N; last first.
- by rewrite ltn_add2l indexg_gt1 subsetIidl not_cHU //; have [] := Mtype24.
- have {1}->: #|U : C| = #|HU : HC| by apply: index_sdprodr (subsetIl _ _).
- by rewrite mulnC (Lagrange_index sHC_HU) // bounded_proper_coherent ?gFnormal.
-have regHC_W1: semiregular (HC / M^`(2)) (W1 / M^`(2)).
- by apply: semiregularS (Frobenius_reg_ker frobMtilde); rewrite quotientS.
-suffices /dvdnP[k Dk]: 2 * q %| #|HC : M^`(2)|.-1.
- apply: contraTeq ubHC; rewrite -leqNgt eqEsubset sM''_HC -indexg_gt1 addn1.
- by rewrite -[#|_:_|]prednK // {}Dk !ltnS muln_gt0 => /andP[/leq_pmull->].
-rewrite Gauss_dvd; last by rewrite coprime2n mFT_odd.
-rewrite dvdn2 -subn1 odd_sub // addbT negbK subn1.
-rewrite -card_quotient; last by rewrite (subset_trans sHC_HU) // (der_norm 1).
-have Dq: q = #|W1 / M^`(2)|%g.
- apply/card_isog/quotient_isog; first by rewrite (subset_trans sW1M) ?gFnorm.
- by apply/trivgP; rewrite -tiHU_W1 setSI // (der_sub 1).
-rewrite quotient_odd ?mFT_odd //= Dq regular_norm_dvd_pred ?quotient_norms //.
-by rewrite (subset_trans sW1M) ?normal_norm.
-Qed.
-Local Notation defM'' := FTtype34_der2.
-
-(* This is Peterfalvi (11.6). *)
-Lemma FTtype34_facts (H' := H^`(1)%g):
- [/\ p.-group H, U \subset 'C(H0), H0 :=: H' & C :=: U'].
-Proof.
-have nilH: nilpotent H := Fcore_nil M.
-have /sdprod_context[/andP[_ nHM] sUW1M _ _ _] := Ptype_Fcore_sdprod MtypeP.
-have coH_UW1: coprime #|H| #|U <*> W1| := Ptype_Fcore_coprime MtypeP.
-have [[_ mulHU _ tiHU] [nHU isomHU]] := (sdprodP defHU, sdprod_isom defHU).
-have{sUW1M} cH0U: U \subset 'C(H0).
- have frobUW1 := Ptype_compl_Frobenius maxM MtypeP notMtype5.
- have nH0_UW1 := subset_trans sUW1M nH0M; have [_ nH0W1] := joing_subP nH0_UW1.
- have [coH0_UW1 solH0] := (coprimeSg sH0H coH_UW1, solvableS sH0H solH).
- have [_ -> //] := Frobenius_Wielandt_fixpoint frobUW1 nH0_UW1 coH0_UW1 solH0.
- have ->: 'C_H0(W1) = H0 :&: 'C_H(W1) by rewrite setIA (setIidPl sH0H).
- have nH0C: 'C_H(W1) \subset 'N(H0) by rewrite subIset // normal_norm.
- rewrite cardMg_TI // -LagrangeMl -card_quotient {nH0C}//.
- rewrite coprime_quotient_cent ?(coprimeSg sHHU) //=.
- have [_ -> _] := Ptype_Fcore_factor_facts maxM MtypeP notMtype5.
- by rewrite (typeP_cent_core_compl MtypeP) def_p.
-have{isomHU} defC: C :=: U'.
- have [injHquo defHUb] := isomP isomHU.
- apply: (injm_morphim_inj injHquo); rewrite ?subsetIl ?morphim_der ?der_sub //.
- rewrite defHUb morphim_restrm -quotientE setIA setIid -quotientMidl /=.
- by rewrite (dprodW defHC) -defM'' -quotient_der // -mulHU mul_subG ?normG.
-have{coH_UW1} defH0: H0 :=: H'.
- pose Hhat := (H / H')%g; pose Uhat := (U / H')%g; pose HUhat := (HU / H')%g.
- have nH'H: H \subset 'N(H') by apply: gFnorm.
- have nH'U: U \subset 'N(H') by apply: gFnorm_trans.
- apply/eqP; rewrite eqEsubset andbC.
- rewrite der1_min ?(abelem_abelian abelHbar) ?normal_norm //=.
- rewrite -quotient_sub1 /= -/H'; last exact: subset_trans sH0H nH'H.
- suffices <-: 'C_Hhat(Uhat) = 1%g.
- by rewrite subsetI quotientS //= quotient_cents // centsC.
- suffices: ~~ ('C_Hhat(Uhat)^`(1)%g \proper 'C_Hhat(Uhat)).
- exact: contraNeq (sol_der1_proper (quotient_sol _ solH) (subsetIl Hhat _)).
- have {2}<-: HUhat^`(1)%g :&: 'C_Hhat(Uhat) = 'C_Hhat(Uhat).
- rewrite -quotient_der ?[HU^`(1)%g]defM''; last by rewrite -mulHU mul_subG.
- by rewrite (setIidPr _) ?subIset // quotientS ?joing_subl.
- suffices defHUhat: 'C_Hhat(Uhat) \x ([~: Hhat, Uhat] <*> Uhat) = HUhat.
- rewrite -(dprod_modl (der_dprod 1 defHUhat)) ?der_sub //= -/Hhat.
- rewrite [rhs in _ \x rhs](trivgP _) ?dprodg1 ?properxx //= -/Hhat.
- by have [_ _ _ <-] := dprodP defHUhat; rewrite setIC setIS ?der_sub.
- have coHUhat: coprime #|Hhat| #|Uhat|.
- by rewrite coprime_morph ?(coprimegS _ coH_UW1) ?joing_subl.
- have defHhat: 'C_Hhat(Uhat) \x [~: Hhat, Uhat] = Hhat.
- by rewrite dprodC coprime_abelian_cent_dprod ?der_abelian ?quotient_norms.
- rewrite /HUhat -(sdprodWY defHU) quotientY //= -(dprodWY defHhat).
- have [_ _ cCRhat tiCRhat] := dprodP defHhat.
- rewrite dprodEY ?joingA //; first by rewrite join_subG cCRhat centsC subsetIr.
- apply/trivgP; rewrite /= joingC norm_joinEl ?commg_normr //= -/Hhat -/Uhat.
- rewrite -tiCRhat !(setIAC _ 'C(_)) setSI // subsetI subsetIl /=.
- by rewrite -group_modr ?commg_subl ?quotient_norms //= coprime_TIg ?mul1g.
-suffices{defC defH0}: p.-group H by [].
-pose R := 'O_p^'(H); have hallR: p^'.-Hall(H) R := nilpotent_pcore_Hall _ nilH.
-have defRHp: R \x 'O_p(H) = H by rewrite dprodC nilpotent_pcoreC.
-suffices R_1: R :=: 1%g by rewrite -defRHp R_1 dprod1g pcore_pgroup.
-have /subsetIP[sRH cUR]: R \subset 'C_H(U).
- have oH: #|H| = (p ^ q * #|'C_H(U)|)%N.
- by have:= typeII_IV_core maxM MtypeP notMtype5 => /=; rewrite ifN => // -[].
- apply/setIidPl/eqP; rewrite eqEcard subsetIl /= (card_Hall hallR) {}oH.
- rewrite (card_Hall (setI_normal_Hall _ hallR _)) ?subsetIl ?gFnormal //.
- rewrite partnM ?expn_gt0 ?cardG_gt0 //= part_p'nat ?mul1n ?pnatNK //.
- by rewrite pnat_exp ?pnat_id.
-suffices: ~~ (R^`(1)%g \proper R) by apply: contraNeq (sol_der1_proper solH _).
-have /setIidPr {2}<-: R \subset HU^`(1)%g.
- by rewrite [HU^`(1)%g]defM'' -(dprodWY defHC) sub_gen ?subsetU ?sRH.
-suffices defRHpU: R \x ('O_p(H) <*> U) = HU.
- rewrite -(dprod_modl (der_dprod 1 defRHpU)) ?der_sub //= -/R setIC.
- rewrite [rhs in _ \x rhs](trivgP _) ?dprodg1 ?properxx //= -/R.
- by have /dprodP[_ _ _ <-] := defRHpU; rewrite setIS ?der_sub.
-rewrite -(sdprodWY defHU) -[in RHS](dprodWY defRHp) -joingA.
-have [_ _ cRHp tiRHp] := dprodP defRHp.
-rewrite dprodEY //= -/R; first by rewrite join_subG cRHp centsC.
-rewrite joingC norm_joinEl 1?gFnorm_trans //.
-by rewrite -(setIidPl sRH) -setIA -group_modr ?gFsub // tiHU mul1g.
-Qed.
-
-Let frobUW1bar : [Frobenius U <*> W1 / C = (U / C) ><| (W1 / C)].
-Proof.
-have frobUW1: [Frobenius U <*> W1 = U ><| W1].
- exact: Ptype_compl_Frobenius MtypeP notMtype5.
-have [defUW1 ntU _ _ _] := Frobenius_context frobUW1.
-have [[_ _ _ defC] regUW1] := (FTtype34_facts, Frobenius_reg_ker frobUW1).
-rewrite Frobenius_coprime_quotient // /normal ?subIset ?joing_subl //.
-by split=> [|x /regUW1->]; rewrite ?sub1G //= defC (sol_der1_proper solHU).
-Qed.
-
-(* This is Peterfalvi (11.7). *)
-(* We have recast the linear algebra arguments in the original text in pure- *)
-(* group-theoretic terms: the overhead of the abelem_rV correspondence is not *)
-(* justifiable here, as the Ssreflect linear algebra library lacks specific *)
-(* support for bilinear forms: we use D y z := [~ coset Q y, coset Q z] as *)
-(* our "linear form". D is antisymmetric as D z y = (D y z)^-1, so we only *)
-(* show that D is "linear" in z, that is, that D y is a group morphism with *)
-(* domain H whose kernel contains H0, when y \in H, and we do not bother to *)
-(* factor D to obtain a form over Hbar = H / H0. *)
-(* We further rework the argument to support this change in perspective: *)
-(* - We remove any reference to linear algebra in the "Galois" (9.7b) case, *)
-(* where U acts irreducibly on Hbar: we revert to the proof of the *)
-(* original Odd Order paper, using the fact that H / Q is extraspecial. *)
-(* - In the "non-Galois" (9.7a) case, we use the W1-conjugation class of a *)
-(* generator of H1 as an explicit basis of Hbar, indexed by W1, and we *)
-(* use the elements xbar_ w = coset H0 (x_ w) of this basis instead of *)
-(* arbitrary y in H_i, as the same argument then justifies extending *)
-(* commutativity to all of Hbar. *)
-(* - We construct phi as the morphism mapping ubar in Ubar to the n such *)
-(* that the action of ubar on H1 is exponentiation by n. We derive a *)
-(* morphism phi_ w ubar for the action of Ubar on H1 ^ w, for w in W1, by *)
-(* composign with the action QV of W1 on Ubar by inverse conjugation. *)
-(* - We exchange the two alternatives in the (9.7a) case; most of proof is *)
-(* thus by contradiction with the C_U(Hbar) != u assertion in (9.6), *)
-(* first establishing case 9.7a (as 9.7b contradicts q odd), then that D *)
-(* is nontrivial for some x_ w1 and x_ w2 (as (H / Q)' = H0 / Q != 1), *)
-(* whence (phi_ w1 u)(phi_ w2 u) = 1, whence (phi u)^-1 = phi u and *)
-(* phi = 1, i.e., Ubar centralises Wbar. *)
-(* Note finally that we simply construct U as a maximal subgroup of H0 normal *)
-(* in H, as the nilpotence of H / Q implies that H0 / Q lies in its center. *)
-Lemma FTtype34_Fcore_kernel_trivial :
- [/\ p.-abelem H, #|H| = (p ^ q)%N & `H0 = 1%g].
-Proof.
-have [[_ _ nHU tiHU] [pH cH0U defH' _]] := (sdprodP defHU, FTtype34_facts).
-have [/mulG_sub[_ sW1M] nH0H] := (sdprodW defM, normal_norm nsH0H).
-have nHW1: W1 \subset 'N(H) := subset_trans sW1M (gFnorm _ M).
-have nUW1: W1 \subset 'N(U) by have [_ []] := MtypeP.
-pose bar := coset_morphism H0; pose Hbar := (H / H0)%g; pose Ubar := (U / H0)%g.
-have [Cbar_neqU _ /= oHbar] := Ptype_Fcore_factor_facts maxM MtypeP notMtype5.
-rewrite -/Hbar def_p // -/q in oHbar.
-have [nH0U nH0W1] := (subset_trans sUM nH0M, subset_trans sW1M nH0M).
-suffices H0_1 : `H0 = 1%g.
- have isoHbar: H \isog H / H0 by rewrite H0_1 quotient1_isog.
- by rewrite (isog_abelem isoHbar) (card_isog isoHbar).
-apply: contraNeq Cbar_neqU => ntH0; rewrite [Ptype_Fcompl_kernel _]unlock.
-suffices: Hbar \subset 'C(Ubar).
- by rewrite (sameP eqP setIidPl) sub_astabQ nH0U centsC.
-have pH0 := pgroupS sH0H pH; have{ntH0} [_ _ [k oH0]] := pgroup_pdiv pH0 ntH0.
-have{k oH0} [Q maxQ nsQH]: exists2 Q : {group gT}, maximal Q H0 & Q <| H.
- have [Q [sQH0 nsQH oQ]] := normal_pgroup pH nsH0H (leq_pred _).
- exists Q => //; apply: p_index_maximal => //.
- by rewrite -divgS // oQ oH0 pfactorK //= expnS mulnK ?expn_gt0 ?cardG_gt0.
-have nsQH0: Q <| H0 := p_maximal_normal (pgroupS sH0H pH) maxQ.
-have [[sQH0 nQH0] nQH] := (andP nsQH0, normal_norm nsQH).
-have nQU: U \subset 'N(Q) by rewrite cents_norm ?(centsS sQH0).
-pose hat := coset_morphism Q; pose Hhat := (H / Q)%g; pose H0hat := (H0 / Q)%g.
-have{maxQ} oH0hat: #|H0hat| = p by rewrite card_quotient ?(p_maximal_index pH0).
-have defHhat': Hhat^`(1)%g = H0hat by rewrite -quotient_der -?defH'.
-have ntH0hat: H0hat != 1%g by rewrite -cardG_gt1 oH0hat prime_gt1.
-have pHhat: p.-group Hhat by apply: quotient_pgroup.
-have nsH0Hhat: H0hat <| Hhat by apply: quotient_normal.
-have sH0hatZ: H0hat \subset 'Z(Hhat).
- by rewrite prime_meetG ?oH0hat // meet_center_nil ?(pgroup_nil pHhat).
-have{pHhat} gal'M: ~~ typeP_Galois MtypeP.
- have sZHhat: 'Z(Hhat) \subset Hhat := center_sub _.
- have nsH0hatZ: H0hat <| 'Z(Hhat) := normalS sH0hatZ sZHhat nsH0Hhat.
- have [f injf im_f] := third_isom sQH0 nsQH nsH0H.
- have fHhat: f @* (Hhat / H0hat) = Hbar by rewrite im_f.
- apply: contra (odd (logn p #|Hhat|)) _ _; last first.
- rewrite -(divnK (cardSg (quotientS Q sH0H))) divg_normal // oH0hat.
- by rewrite -(card_injm injf) // fHhat oHbar -expnSr pfactorK //= mFT_odd.
- rewrite /typeP_Galois acts_irrQ // => /mingroupP[_ minUHbar].
- suffices /(card_extraspecial pHhat)[n _ ->]: extraspecial Hhat.
- by rewrite pfactorK //= odd_double.
- have abelH: p.-abelem (Hhat / H0hat)%g by rewrite -(injm_abelem injf) ?fHhat.
- suffices{abelH} defZHhat: 'Z(Hhat) = H0hat.
- do 2?split; rewrite defZHhat ?oH0hat //.
- apply/eqP; rewrite eqEsubset (Phi_min pHhat) ?normal_norm //=.
- by rewrite (Phi_joing pHhat) defHhat' joing_subl.
- apply: contraNeq ntH0hat; rewrite eqEsubset sH0hatZ andbT => not_esHhat.
- rewrite -defHhat'; apply/eqP/derG1P/center_idP/(quotient_inj nsH0hatZ)=> //.
- apply: (injm_morphim_inj injf); rewrite ?quotientS //= fHhat -/Hhat -/H0hat.
- rewrite minUHbar //= -/Hbar -?fHhat 1?morphim_injm_eq1 ?morphimS // -subG1.
- rewrite quotient_sub1 ?(normal_norm nsH0hatZ) // not_esHhat -['Z(_)]cosetpreK.
- rewrite im_f ?sub_cosetpre_quo // quotient_norms ?norm_quotient_pre //.
- by rewrite gFnorm_trans ?quotient_norms.
-have [H1 []] := typeP_Galois_Pn maxM notMtype5 gal'M.
-rewrite def_p => oH1 nH1Ubar _ /bigdprodWY-defHbar _.
-have /cyclicP[xbar defH1]: cyclic H1 by rewrite prime_cyclic ?oH1.
-have H1xbar: xbar \in H1 by rewrite defH1 cycle_id.
-have sH1_Hbar: H1 \subset Hbar.
- by rewrite -[Hbar]defHbar (bigD1 1%g) ?group1 ?conjsg1 ?joing_subl.
-have{sH1_Hbar} Hxbar: xbar \in Hbar := subsetP sH1_Hbar xbar H1xbar.
-have /morphimP[x nH0x Hx /= Dxbar] := Hxbar.
-have{oH1} oxbar: #[xbar] = p by rewrite orderE -defH1.
-have memH0: {in H &, forall y z, [~ y, z] \in H0}.
- by rewrite defH'; apply: mem_commg.
-have [_ /centsP-cHH0hat] := subsetIP sH0hatZ; move/subsetP in nQH.
-pose D y z := [~ hat z, hat y].
-have D_H0_1 y z: y \in H -> z \in H0 -> D y z = 1%g.
- by move=> Hy H0z; apply/eqP/commgP/cHH0hat; apply: mem_quotient.
-have H0_D: {in H &, forall y z, D y z \in H0hat}.
- by move=> y z Hy Hz; rewrite -defHhat' mem_commg ?mem_quotient.
-have Dsym y z: (D y z)^-1%g = D z y by rewrite invg_comm.
-have Dmul y: y \in H -> {in H &, {morph D y: z t / z * t}}%g.
- move=> Hy z t Hz Ht; rewrite {1}/D morphM ?nQH // commMgR; congr (_ * _)%g.
- by rewrite -{2}morphR ?nQH // -/(D t _) D_H0_1 ?memH0 // mulg1.
-pose Dm y Hy : {morphism H >-> coset_of Q} := Morphism (Dmul y Hy).
-have{D_H0_1} kerDmH0 y Hy: H0 \subset 'ker (Dm y Hy).
- by rewrite subsetI sH0H; apply/subsetP=> z H0z; rewrite !inE /= D_H0_1.
-pose x_ w := (x ^ w)%g; pose xbar_ w := (xbar ^ bar w)%g.
-move/subsetP in nHW1; move/subsetP in nHU.
-have Hx_ w: w \in W1 -> (x_ w \in H) * {in U, forall u, x_ w ^ u \in H}%g.
- by move/nHW1=> nHw; split=> [|u /nHU-nHu]; rewrite !memJ_norm.
-have Dx: {in H &, forall y z, {in W1, forall w, D (x_ w) y = 1} -> D y z = 1}%g.
- move=> y z Hy Hz Dxy1; apply/(kerP (Dm y Hy) Hz); apply: subsetP z Hz.
- rewrite -(quotientSGK nH0H) ?kerDmH0 // -defHbar gen_subG.
- apply/bigcupsP=> _ /morphimP[w nH0w W1w ->] /=.
- rewrite defH1 Dxbar -quotient_cycle -?quotientJ ?quotientS // -cycleJ.
- by rewrite cycle_subG !inE /= Hx_ //= -Dsym eq_invg1 Dxy1.
-pose ntrivD := [exists w in [predX W1 & W1], #[D (x_ w.1) (x_ w.2)] == p].
-have{ntrivD Dx} /exists_inP[[w1 w2] /andP/=[Ww1 Ww2] /eqP-oDx12]: ntrivD.
- apply: contraR ntH0hat => Dx_1; rewrite -defHhat' -subG1 gen_subG.
- apply/subsetP=> _ /imset2P[_ _ /morphimP[y ? Hy ->] /morphimP[z ? Hz ->] ->].
- apply/set1P/Dx=> // w2 Ww2; rewrite Dx ?Hx_ // => w1 Ww1.
- have abelH0hat: p.-abelem H0hat by apply: prime_abelem.
- apply: contraNeq Dx_1 => /(abelem_order_p abelH0hat)oDx12.
- by apply/exists_inP; exists (w1, w2); rewrite ?inE ?Ww1 // oDx12 ?H0_D ?Hx_.
-have /subsetP-nUW1bar: (W1 / H0)%g \subset 'N(Ubar) := quotient_norms H0 nUW1.
-move/subsetP in nH0H; move/subsetP in nH0W1.
-pose n (phi : {morphism Ubar >-> {unit 'F_p}}) ubar : nat := val (phi ubar).
-have [phi Dphi]: {phi | {in Ubar, forall ub, xbar ^ ub =xbar ^+ n phi ub}}%g.
- pose xbar_Autm := invm (injm_Zp_unitm xbar).
- have /restrmP[phi [Dphi _ _ _]]: Ubar \subset 'dom (xbar_Autm \o conj_aut H1).
- by rewrite -sub_morphim_pre //= im_Zp_unitm -defH1 Aut_conj_aut.
- rewrite /n pdiv_id // -oxbar; exists phi => ubar /(subsetP nH1Ubar)Uubar.
- transitivity (Zp_unitm (phi ubar) xbar); last by rewrite autE /= -?defH1.
- by rewrite Dphi invmK ?im_Zp_unitm -?defH1 ?Aut_aut ?norm_conj_autE.
-pose QV ubar w := (ubar ^ (bar w)^-1)%g.
-have UbarQV: {in Ubar & W1, forall ubar w, QV ubar w \in Ubar}.
- by move=> ub w Uub W1w; rewrite /= memJ_norm ?groupV ?nUW1bar ?mem_quotient.
-pose phi_ w ub := phi (QV ub w); pose nphi_ w ub := n phi (QV ub w).
-have xbarJ: {in W1 & Ubar, forall w ub, xbar_ w ^ ub = xbar_ w ^+ nphi_ w ub}%g.
- by move=> w ubar * /=; rewrite -conjgM conjgCV conjgM Dphi ?UbarQV // conjXg.
-have{oDx12} phi_w12 ubar: ubar \in Ubar -> (phi_ w1 ubar * phi_ w2 ubar = 1)%g.
- pose n_u := nphi_ ^~ ubar => Uubar; have [u nH0u Uu Dubar] := morphimP Uubar.
- suffices: n_u w1 * n_u w2 == 1 %[mod #[D (x_ w1) (x_ w2)]].
- by apply: contraTeq; rewrite oDx12 -!val_Fp_nat // natrM !natr_Zp.
- have DXn: {in H & W1, forall y w, D y (x_ w) ^+ n_u w = D y (x_ w ^ u)}%g.
- move=> y w Hy W1w; set z := x_ w; have [Hz /(_ u Uu) Hzu] := Hx_ w W1w.
- rewrite -(morphX (Dm y Hy)) //; apply/rcoset_kerP; rewrite ?groupX //.
- have /subsetP: H0 :* z ^ u \subset 'ker (Dm y Hy) :* z ^ u by rewrite mulSg.
- apply; apply/rcoset_kercosetP; rewrite ?groupX ?nH0H //.
- by rewrite morphX ?morphJ ?(nH0W1 w) // ?nH0H //= -Dubar -Dxbar xbarJ.
- rewrite -eq_expg_mod_order -{1}Dsym expgM expgVn ?(DXn, Dsym) ?Hx_ //.
- rewrite /D -!morphR ?nQH ?Hx_ // -conjRg (conjg_fixP _) //.
- by apply/commgP/esym/(centsP cH0U); rewrite ?memH0 ?Hx_.
-pose wbar := bar (w1 * w2 ^-1)%g; pose W1bar := (W1 / H0)%g.
-have W1wbar: wbar \in W1bar by rewrite mem_quotient ?groupM ?groupV.
-have{phi_w12} phiJ: {in Ubar, forall ubar, phi (ubar ^ wbar) = (phi ubar)^-1}%g.
- move=> ubar Uubar; apply/esym/eqP; rewrite eq_invg_mul.
- rewrite [wbar]morphM ?morphV ?nH0W1 ?groupV // -{1}[ubar](conjgK (bar w1)).
- by rewrite conjgM phi_w12 // memJ_norm ?nUW1bar ?mem_quotient.
-have coW1bar2: coprime #|W1bar| 2 by rewrite coprimen2 quotient_odd ?mFT_odd.
-have coUbar2: coprime #|Ubar| 2 by rewrite coprimen2 quotient_odd ?mFT_odd.
-have{wbar phiJ W1wbar} phiV: {in Ubar, forall ubar, phi ubar = (phi ubar)^-1}%g.
- move=> ubar Uubar; rewrite /= -phiJ // -(expgK coW1bar2 W1wbar) -expgM mul2n.
- elim: (expg_invn _ _) => [|k IHk]; first by rewrite conjg1.
- by do 2!rewrite expgSr conjgM phiJ ?memJ_norm ?nUW1bar ?groupX // ?invgK.
-rewrite -[Hbar]defHbar gen_subG defH1; apply/bigcupsP=> _ /morphimP[w _ Ww ->].
-rewrite -cycleJ cycle_subG -/(xbar_ _); apply/centP=> ubar Uubar; apply/commgP.
-apply/conjg_fixP; rewrite xbarJ // /nphi_ -[QV _ w](expgK coUbar2) ?UbarQV //.
-by rewrite /n !morphX ?groupX 1?expgS 1?{1}phiV ?UbarQV // mulVg expg1n.
-Qed.
-
-Let defU' : C :=: U'. Proof. by have [] := FTtype34_facts. Qed.
-Let H0_1 : H0 :=: 1%g. Proof. by have [] := FTtype34_Fcore_kernel_trivial. Qed.
-
-Lemma Ptype_Fcompl_kernel_cent : Ptype_Fcompl_kernel MtypeP :=: C.
-Proof.
-rewrite [Ptype_Fcompl_kernel MtypeP]unlock /= (group_inj H0_1).
-by rewrite astabQ -morphpreIim -injm_cent ?injmK ?ker_coset ?norms1.
-Qed.
-Local Notation defC := Ptype_Fcompl_kernel_cent.
-
-(* Character theory proper. *)
-
-Let pddM := FT_prDade_hyp maxM MtypeP.
-Let ptiWM : primeTI_hypothesis M HU defW := FT_primeTI_hyp MtypeP.
-Let ctiWG : cyclicTI_hypothesis G defW := pddM.
-Let ctiWM : cyclicTI_hypothesis M defW := prime_cycTIhyp ptiWM.
-
-Local Notation sigma := (cyclicTIiso ctiWG).
-Local Notation w_ i j := (cyclicTIirr defW i j).
-Local Notation eta_ i j := (sigma (w_ i j)).
-Local Notation mu_ := (primeTIred ptiWM).
-Local Notation Idelta := (primeTI_Isign ptiWM).
-Local Notation delta_ j := (primeTIsign ptiWM j).
-Local Notation d := (FTtype345_TIirr_degree MtypeP).
-Local Notation n := (FTtype345_ratio MtypeP).
-Local Notation delta := (FTtype345_TIsign MtypeP).
-
-Implicit Types zeta xi lambda : 'CF(M).
-
-Let u := #|U / C|%g.
-Let mu2_ i j := primeTIirr ptiWM i j.
-Let etaW := map sigma (irr W).
-Let eq_proj_eta (alpha gamma : 'CF(G)) := orthogonal (alpha - gamma) etaW.
-Let eta_col j := \sum_i eta_ i j.
-Let bridge0 zeta := mu_ 0 - zeta.
-
-Let proj_col_eta j0 i j : '[eta_col j0, eta_ i j] = (j == j0)%:R.
-Proof.
-rewrite cfdot_suml (bigD1 i) //= cfdot_cycTIiso eqxx eq_sym.
-by rewrite big1 ?addr0 // => k /negPf-i'k; rewrite cfdot_cycTIiso i'k.
-Qed.
-
-Let nirrW1 : #|Iirr W1| = q. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let NirrW1 : Nirr W1 = q. Proof. by rewrite -nirrW1 card_ord. Qed.
-
-Let nirrW2 : #|Iirr W2| = p. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let NirrW2 : Nirr W2 = p. Proof. by rewrite -nirrW2 card_ord. Qed.
-
-Let calT := seqIndT HU M.
-Let S1 := S_ HC.
-Let S2 := seqIndD HU M HC C.
-
-Let sS10 : cfConjC_subset S1 calS.
-Proof. by apply: seqInd_conjC_subset1; rewrite /= ?defMs. Qed.
-
-Let sS20 : cfConjC_subset S2 calS.
-Proof. by apply: seqInd_conjC_subset1; rewrite /= ?defMs. Qed.
-
-Let scohS1 : subcoherent S1 tau R. Proof. exact: subset_subcoherent sS10. Qed.
-Let scohS2 : subcoherent S2 tau R. Proof. exact: subset_subcoherent sS20. Qed.
-
-Let S1_1 : {in S1, forall zeta, zeta 1%g = q%:R}.
-Proof.
-move=> _ /seqIndP[s /setDP[kerM'' _] ->]; rewrite !inE -defM'' in kerM''.
-by rewrite cfInd1 ?gFsub // -(index_sdprod defM) lin_char1 ?mulr1 ?lin_irr_der1.
-Qed.
-
-Let cohS1 : coherent S1 M^# tau.
-Proof.
-apply: uniform_degree_coherence scohS1 _.
-by apply/(@all_pred1_constant _ q%:R)/allP=> _ /=/mapP[zeta /S1_1<- ->].
-Qed.
-
-Let irrS1 : {subset S1 <= irr M}.
-Proof.
-move=> _ /seqIndP[s /setDP[kerHC kerHU] ->]; rewrite !inE in kerHC kerHU.
-rewrite -(quo_IirrK _ kerHC) // mod_IirrE // cfIndMod // cfMod_irr //.
-have /irr_induced_Frobenius_ker := FrobeniusWker frobMtilde; rewrite defM''.
-by apply; rewrite quo_Iirr_eq0 // -subGcfker.
-Qed.
-
-Let o1S1 : orthonormal S1.
-Proof. exact: sub_orthonormal (seqInd_uniq _ _) (irr_orthonormal _). Qed.
-
-Let cfdotS1 : {in S1 &, forall zeta xi, '[zeta, xi] = (zeta == xi)%:R}.
-Proof. by case/orthonormalP: o1S1. Qed.
-
-Let omu2S1 i j : {in S1, forall zeta, '[mu2_ i j, zeta] = 0}.
-Proof.
-move=> zeta S1zeta; have [s _ Dzeta] := seqIndP S1zeta.
-rewrite Dzeta -cfdot_Res_l cfRes_prTIirr cfdot_irr mulrb ifN_eq //.
-apply: contraNneq (prTIred_not_irr ptiWM j) => Ds.
-by rewrite -cfInd_prTIres Ds -Dzeta irrS1.
-Qed.
-
-Let Tmu j : mu_ j \in calT. Proof. by rewrite -cfInd_prTIres mem_seqIndT. Qed.
-
-Let omuS1 j : {in S1, forall zeta, '[mu_ j, zeta] = 0}.
-Proof.
-by move=> zeta S1zeta /=; rewrite cfdot_suml big1 // => i _; apply: omu2S1.
-Qed.
-
-Let Zbridge0 : {in S1, forall zeta, bridge0 zeta \in 'Z[irr M, HU^#]}.
-Proof.
-have mu0_1: mu_ 0 1%g = q%:R by rewrite prTIred_1 prTIirr0_1 mulr1.
-move=> zeta S1zeta; rewrite /= zcharD1 !cfunE subr_eq0 mu0_1 S1_1 // eqxx.
-by rewrite rpredB ?(seqInd_vchar _ (Tmu 0)) ?(seqInd_vchar _ S1zeta).
-Qed.
-
-Let A0bridge0 : {in S1, forall zeta, bridge0 zeta \in 'CF(M, 'A0(M))}.
-Proof. by move=> zeta /Zbridge0/zchar_on/cfun_onS->. Qed.
-
-Let sS1S2' : {subset S1 <= [predC S2]}.
-Proof.
-by move=> _ /seqIndP[s /setDP[kHCs _] ->]; rewrite !inE mem_seqInd // inE kHCs.
-Qed.
-
-Let defS2: S2 = seqIndD HU M H H0C.
-Proof. by rewrite /S2 H0_1 -!joinGE join1G joinGC seqIndDY. Qed.
-
-Let cohS2: coherent S2 M^# tau.
-Proof.
-apply: subset_coherent (Ptype_core_coherence maxM MtypeP notMtype5).
-by rewrite defC defS2; apply: seqIndS; rewrite Iirr_kerDS ?genS ?setUS ?der_sub.
-Qed.
-
-Let Smu := [seq mu_ j | j in predC1 0].
-Let Sred := filter [predC irr M] (seqIndD HU M H H0).
-
-Let memSred : Sred =i Smu.
-Proof.
-have [szSred _ memSred _] := typeP_reducible_core_Ind maxM MtypeP notMtype5.
-have uSred: uniq Sred by apply: filter_uniq (seqInd_uniq _ _).
-suffices{uSred}: (size Smu <= size Sred)%N by case/leq_size_perm.
-by rewrite szSred def_p size_map -cardE cardC1 nirrW2.
-Qed.
-
-Let mu_1 j : j != 0 -> mu_ j 1%g = (q * u)%:R.
-Proof.
-move=> nzj; have Smuj: mu_ j \in Sred by rewrite memSred image_f.
-have [_ _ _ /(_ _ Smuj)[]] := typeP_reducible_core_Ind maxM MtypeP notMtype5.
-by rewrite defC.
-Qed.
-
-Let memS2red : [predD S2 & irr M] =i Smu.
-Proof.
-move=> xi; rewrite defS2 -memSred mem_filter; apply: andb_id2l => /= red_xi.
-apply/idP/idP=> [|Sxi]; first by apply: seqIndS; rewrite Iirr_kerDS ?joing_subl.
-have [_ _ _ /(_ xi)] := typeP_reducible_core_Ind maxM MtypeP notMtype5.
-by rewrite defC mem_filter /= red_xi; case.
-Qed.
-
-Let i1 : Iirr W1 := inord 1.
-Let nz_i1 : i1 != 0. Proof. by rewrite Iirr1_neq0. Qed.
-Let j1 : Iirr W2 := inord 1.
-Let nz_j1 : j1 != 0. Proof. by rewrite Iirr1_neq0. Qed.
-
-(* This is Peterfalvi (11.8). *)
-(* We have rearranged the argument somewhat: *)
-(* - Step (11.8.4) was out of sequence as it involves changing the definition *)
-(* of tau2, which requires showing that (11.8.2-3) are preserved by this *)
-(* change; since (11.8.4) does not use (11.8.2-3) we avoid this by proving *)
-(* (11.8.4) first. *)
-(* - The first part of step (11.8.3) is the last fact that needs to be proved *)
-(* for an arbitrary j != 0; (11.8.1, 5-6) can all use the same fixed j != 0 *)
-(* (we take j = 1), provided (11.8.3) is proved before (11.8.2), which it *)
-(* doe not use. *)
-(* - Steps (11.8.2) and (11.8.5) are really as combination, to provide an *)
-(* expression for tau (alpha i j) for an arbitrary i. We merge their proofs *)
-(* so we can use a fixed i for the whole combined step and hide some *)
-(* intermediate technical facts. *)
-(* - We also reorganise the contents of the superstep, proving most of *)
-(* (11.8.5) between the first and last two parts of (11.8.2); this *)
-(* simplifies the latter because a is then known to be even, so we can show *)
-(* directly that a is 0 or 2, and then that X = eta i j - eta i 0. *)
-Lemma FTtype34_not_ortho_cycTIiso zeta :
- zeta \in S1 -> ~~ eq_proj_eta (tau (bridge0 zeta)) (eta_col 0).
-Proof.
-move=> S1zeta; set psi := tau _; apply/negP=> proj_psi_eta.
-have irr_zeta: zeta \in irr M := irrS1 S1zeta.
-have Szeta: zeta \in S_ 1 by apply: seqInd_sub S1zeta.
-have Zzeta_S1: {in S1, forall xi, zeta - xi \in 'Z[S1, M^#]}.
- by move=> * /=; rewrite zcharD1E rpredB ?mem_zchar //= !cfunE !S1_1 ?subrr.
-have n1S1: {in S1, forall xi, '[xi] = 1} by move=> xi /irrS1/irrWnorm.
-have Z_S1: {in S1, forall xi, xi \in 'Z[S1]} by apply: mem_zchar.
-have [p_gt0 q_gt0 u_gt0]: [/\ p > 0, q > 0 & u > 0]%N by rewrite !cardG_gt0.
-have q_gt2: (q > 2)%N by rewrite odd_prime_gt2 ?mFT_odd.
-have mu2_1 i j: j != 0 -> mu2_ i j 1%g = d%:R.
- by have [/(_ i j)] := FTtype345_constants maxM MtypeP notMtype2.
-(* This is (11.8.1). *)
-have [Dd delta1 Dn]: [/\ d = u, delta = 1 & n = (size S1)%:R].
- have size_S1 : (size S1 * q = u - 1)%N.
- rewrite mulnC [q](index_sdprod defM).
- rewrite (size_irr_subseq_seqInd _ (subseq_refl _)) //.
- transitivity #|[set mod_Iirr t | t : Iirr (HU / HC) in predC1 0]|.
- apply/eq_card=> s; rewrite inE mem_seqInd // !inE subGcfker.
- apply/andP/imsetP=> [[nzs kHCs] | [t nzt ->]].
- by exists (quo_Iirr HC s); rewrite ?quo_IirrK // inE quo_Iirr_eq0.
- by rewrite mod_Iirr_eq0 // mod_IirrE // cfker_mod.
- rewrite card_imset; last exact: can_inj (mod_IirrK _).
- have isoUC: U / C \isog HU / HC by apply: quotient_sdprodr_isog.
- rewrite subn1 cardC1 card_Iirr_abelian -?(card_isog isoUC) //.
- by rewrite -(isog_abelian isoUC) defU' der_abelian.
- have Dd: d = u.
- apply/eqP; rewrite -(eqn_pmul2l q_gt0) -eqC_nat -(mu_1 nz_j1).
- by rewrite natrM prTIred_1 mu2_1.
- suffices delta1: delta = 1.
- by rewrite /n Dd delta1 -(@natrB _ _ 1) // -size_S1 natrM mulfK ?neq0CG.
- have: (delta == 1 %[mod q])%C.
- rewrite -(eqCmod_transl _ (prTIirr1_mod ptiWM 0 j1)) mu2_1 // -/q Dd.
- by rewrite /eqCmod -(@natrB _ u 1) // dvdC_nat -size_S1 dvdn_mull.
- rewrite -[1]subr0 [delta]signrE -/ptiWM eqCmodDl eqCmodN opprK.
- by rewrite eqCmod0_nat; case: (Idelta j1); first rewrite gtnNdvd.
-have deltaZ gamma: delta *: gamma = gamma by rewrite delta1 scale1r.
-have [tau1 coh_tau1] := cohS1; pose zeta1 := tau1 zeta.
-(* This is (11.8.4). *)
-without loss Dpsi: tau1 coh_tau1 @zeta1 / psi = eta_col 0 - zeta1.
- move=> IHtau1; have [[Itau1 Ztau1] Dtau1] := coh_tau1.
- have tau1_dirr: {in S1, forall xi, tau1 xi \in dirr G}.
- by move=> xi S1xi; rewrite /= dirrE Ztau1 ?Itau1 ?mem_zchar //= n1S1.
- pose chi : 'CF(G) := eta_col 0 - psi.
- have Dpsi: psi = eta_col 0 - chi by rewrite opprD opprK addNKr.
- have chi'zeta1: chi <> zeta1.
- by move=> Dchi; case: (IHtau1 tau1); rewrite -/zeta1 -?Dchi.
- have dirr_chi: chi \in dirr G.
- apply: dirr_norm1.
- rewrite rpredB ?rpred_sum // => [i _|]; first exact: cycTIiso_vchar.
- rewrite Dade_vchar // zchar_split A0bridge0 //.
- by rewrite rpredB ?char_vchar ?prTIred_char ?irrWchar.
- apply: (addrI q%:R); transitivity '[psi]; last first.
- rewrite Dade_isometry ?A0bridge0 // (cfnormBd (omuS1 _ _)) //.
- by rewrite cfnorm_prTIred n1S1.
- rewrite Dpsi [RHS]cfnormDd; last first.
- rewrite opprB cfdotC cfdot_sumr big1 ?conjC0 // => i _.
- by rewrite (orthoPl proj_psi_eta) ?map_f ?mem_irr.
- rewrite cfnormN -nirrW1 -sumr_const cfdot_sumr.
- by congr (_ + _); apply: eq_bigr => i _; rewrite proj_col_eta.
- have Dchi: {in S1, forall xi, xi != zeta -> chi = - tau1 xi}.
- move=> xi S1xi /negPf-zeta'xi; have irr_xi := irrS1 S1xi.
- suffices: '[zeta1 - tau1 xi, chi] = 1.
- by case/cfdot_add_dirr_eq1; rewrite ?rpredN ?tau1_dirr.
- rewrite /= cfdotBr cfdot_sumr big1 => [|i _]; last first.
- have oS1eta := coherent_ortho_cycTIiso MtypeP sS10 coh_tau1.
- by rewrite cfdotBl !oS1eta ?irrS1 ?subrr.
- rewrite -raddfB Dtau1 ?Zzeta_S1 // Dade_isometry ?A0bridge0 //; last first.
- exact: cfun_onS sHU_A0 (zcharD1_seqInd_on _ (Zzeta_S1 xi S1xi)).
- rewrite cfdotBr cfdotC cfdotBr 2?omuS1 // subrr conjC0 !sub0r opprK.
- by rewrite cfdotBl n1S1 // cfdotS1 // zeta'xi subr0.
- have S1zetaC: zeta^*%CF \in S1 by rewrite cfAut_seqInd.
- have Dchi_zetaC: chi = - tau1 zeta^*%CF.
- by rewrite -Dchi ?(seqInd_conjC_neq _ _ _ S1zeta) ?mFT_odd.
- suffices S1le2: (size S1 <= size [:: zeta; zeta^*%CF])%N.
- case: (IHtau1 (dual_iso tau1)); last by rewrite /= -Dchi_zetaC.
- exact: dual_coherence scohS1 coh_tau1 S1le2.
- rewrite uniq_leq_size ?seqInd_uniq // => xi S1xi.
- rewrite !inE -implyNb; apply/implyP=> zeta'xi; apply/eqP.
- apply: (Zisometry_inj Itau1); rewrite ?mem_zchar ?cfAut_seqInd //.
- by apply: oppr_inj; rewrite -Dchi.
-have [[Itau1 Ztau1] Dtau1] := coh_tau1.
-have tau1_dirr: {in S1, forall xi, tau1 xi \in dirr G}.
- by move=> xi S1xi; rewrite /= dirrE Ztau1 ?Itau1 ?mem_zchar //= n1S1.
-have oS1eta i j: {in S1, forall xi, '[tau1 xi, eta_ i j] = 0}.
- by move=> xi S1xi /=; rewrite (coherent_ortho_cycTIiso _ _ coh_tau1) ?irrS1.
-pose alpha_ := FTtype345_bridge MtypeP zeta.
-have A0alpha i j : j != 0 -> alpha_ i j \in 'CF(M, 'A0(M)).
- by move/supp_FTtype345_bridge->; rewrite ?S1_1.
-have alpha_S1 i j: {in S1, forall xi, '[alpha_ i j, xi] = n *- (xi == zeta)}.
- move=> xi S1xi; rewrite /= !cfdotBl !cfdotZl !omu2S1 // mulr0 subrr add0r.
- by rewrite cfdotS1 // eq_sym mulr_natr.
-pose beta_ i j := tau (alpha_ i j) - (eta_ i j - eta_ i 0) + n *: zeta1.
-pose beta := beta_ 0 j1.
-(* This is the first part of (11.8.3). *)
-have betaE i j: j != 0 -> beta_ i j = beta.
- move=> nz_j; transitivity (beta_ i j1); congr (_ + _); apply/eqP.
- rewrite eq_sym -subr_eq0 [rhs in _ + rhs]opprD addrACA -opprD subr_eq0.
- rewrite -linearB /= !opprB !addrA !subrK -!/(mu2_ i _).
- by rewrite [Dade pddM _]prDade_sub_TIirr ?mu2_1 //= deltaZ.
- rewrite -subr_eq0 !opprD addrACA -3!opprD opprK subr_eq0 addrACA addrA.
- rewrite -(prDade_sub2_TIirr pddM) -!/(mu2_ _ _) !deltaZ -linearB /=.
- by rewrite opprB addrA subrK !deltaZ opprD opprK addrACA addrA.
-pose j := j1. (* The remainder of the proof only uses j = 1. *)
-(* This is the second part of (11.8.3). *)
-have Rbeta: cfReal beta.
- rewrite /cfReal eq_sym -subr_eq0 rmorphD !rmorphB /= opprB 2!opprD opprB -/j.
- rewrite 2![(eta_ 0 _)^*%CF]cfAut_cycTIiso -!cycTIirr_aut !aut_Iirr0 -Dade_aut.
- set k := aut_Iirr conjC j; rewrite -(betaE 0 k) ?aut_Iirr_eq0 // addrACA.
- rewrite addrC addr_eq0 addrCA subrK opprD opprK Dn raddfZnat -!raddfB /= -Dn.
- apply/eqP; rewrite (cfConjC_Dade_coherent coh_tau1) ?mFT_odd // -raddfB.
- rewrite Dtau1 ?Zzeta_S1 ?cfAut_seqInd //= -linearZ scalerBr; congr (tau _).
- rewrite opprD !rmorphB !deltaZ /= -!prTIirr_aut !aut_Iirr0 addrACA subrr.
- by rewrite add0r opprK addrC Dn -raddfZnat.
-(* This is the consequence of Peterfalvi (11.8.2) and (11.8.5). *)
-have tau_alpha i: tau (alpha_ i j) = eta_ i j - eta_ i 0 - n *: zeta1.
- set phi := tau (alpha_ i j); pose sum_tau1 := \sum_(xi <- S1) tau1 xi.
- have A0alpha_j k: alpha_ k j \in 'CF(M, 'A0(M)) by apply: A0alpha.
- have Zphi: phi \in 'Z[irr G].
- by rewrite Dade_vchar // zchar_split vchar_FTtype345_bridge /=.
- have [Y S1_Y [X [Dphi oYX oXS1]]] := orthogonal_split (map tau1 S1) phi.
- (* This is the first part of 11.8.2 *)
- have [a Za defY]: exists2 a, a \in Cint & Y = a *: sum_tau1 - n *: zeta1.
- have [a_ Da defY] := orthonormal_span (map_orthonormal Itau1 o1S1) S1_Y.
- have{Da} Da: {in S1, forall xi, a_ (tau1 xi) = '[phi, tau1 xi]}.
- by move=> xi Sxi; rewrite Da Dphi cfdotDl (orthoPl oXS1) ?map_f ?addr0.
- exists (a_ (tau1 zeta) + n).
- by rewrite Dn rpredD ?rpred_nat // Da // Cint_cfdot_vchar ?Ztau1 ?Z_S1.
- rewrite defY big_map scaler_sumr !(bigD1_seq _ S1zeta) ?seqInd_uniq //=.
- rewrite addrAC scalerDl addrK !(big_seq_cond (predC1 _)) /=; congr (_ + _).
- apply: eq_bigr => xi /andP[S1xi zeta'xi]; congr (_ *: _); rewrite !Da //.
- apply: canRL (addNKr _) _; rewrite addrC -opprB -!raddfB Dtau1 ?Zzeta_S1//=.
- rewrite Dade_isometry //; last first.
- exact: cfun_onS (zcharD1_seqInd_on _ (Zzeta_S1 _ S1xi)).
- by rewrite cfdotBr !alpha_S1 // !mulrb eqxx ifN_eq // !(addr0, opprK).
- have psi_phi: '[psi, phi] = -1 + n. (* This is part of (11.8.5). *)
- rewrite cfdotC Dade_isometry ?A0bridge0 //.
- rewrite cfdotBr !cfdotBl deltaZ !cfdotZl n1S1 // mulr1.
- rewrite !cfdot_prTIirr_red (negPf nz_j1) eqxx !omu2S1 //= cfdotC omuS1 //.
- by rewrite conjC0 mulr0 opprB !subr0 add0r rmorphD rmorphN Dn !rmorph_nat.
- have{psi_phi} col0_beta: '[eta_col 0, beta] = a. (* Also part of (11.8.5). *)
- apply/(addIr (-1 + n))/(canRL (addNKr _)).
- rewrite addrCA addrA addrACA -{}psi_phi Dpsi cfdotBl; congr (_ + _).
- rewrite -(betaE i j) // cfdotDr !cfdotBr -/phi cfdotZr -!addrA.
- apply/(canLR (addNKr _)); rewrite addNr !cfdot_suml.
- rewrite big1 ?add0r ?opprK => [|k _]; last first.
- by rewrite cfdot_cycTIiso andbC eq_sym (negPf nz_j1).
- rewrite addrCA big1 ?mulr0 ?add0r => [|k _]; last first.
- by rewrite cfdotC oS1eta ?conjC0.
- rewrite addrC (bigD1 i) // cfnorm_cycTIiso /= addKr big1 // => k i'k.
- by rewrite cfdot_cycTIiso (negPf i'k).
- rewrite cfdotC Dphi cfdotDl (orthoPl oXS1) ?map_f // addr0.
- rewrite defY cfdotBl scaler_sumr cfproj_sum_orthonormal //.
- rewrite cfdotZl Itau1 ?mem_zchar ?n1S1 // mulr1 rmorphB opprD opprK.
- by rewrite Dn rmorph_nat conj_Cint.
- have a_even: (2 %| a)%C. (* Third internal part of (11.8.5). *)
- have Zbeta: beta \in 'Z[irr G].
- rewrite -{1}(betaE i j) // rpredD ?rpredB ?Zphi ?cycTIiso_vchar //.
- by rewrite Dn rpredZnat // Ztau1 ?mem_zchar.
- rewrite -col0_beta cfdot_real_vchar_even ?mFT_odd //; first 1 last.
- split; first by apply/rpred_sum=> k _; apply: cycTIiso_vchar.
- apply/eqP; rewrite [RHS](reindex_inj (can_inj (@conjC_IirrK _ _))) /=.
- rewrite rmorph_sum; apply/eq_bigr=> k _ /=.
- by rewrite cfAut_cycTIiso -cycTIirr_aut aut_Iirr0.
- have eta00: eta_ 0 0 = 1 by rewrite cycTIirr00 cycTIiso1.
- rewrite orbC cfdotDl 2!cfdotBl cfdotZl -eta00 oS1eta // mulr0 addr0.
- rewrite opprB addrC 2!{1}cfdot_cycTIiso (negPf nz_j1) subr0 /= eta00.
- rewrite Dade_reciprocity // => [|x _ y _]; last by rewrite !cfun1E !inE.
- rewrite cfRes_cfun1 !cfdotBl deltaZ !cfdotZl -!/(mu2_ 0 _).
- rewrite -(prTIirr00 ptiWM) !cfdot_prTIirr cfdotC omu2S1 // conjC0 mulr0.
- by rewrite (negPf nz_j1) add0r subr0 subrr rpred0.
- have nY: '[Y] = n * a * (a - 2%:R) + n ^+ 2. (* Resuming step (11.8.2). *)
- rewrite defY cfnormD cfnormN !cfnormZ cfdotNr cfdotZr.
- rewrite cfnorm_map_orthonormal // -Dn Itau1 ?mem_zchar ?n1S1 // mulr1.
- rewrite scaler_sumr cfproj_sum_orthonormal // rmorphN addrAC.
- rewrite Dn rmorphM !Cint_normK ?rpred_nat // !rmorph_nat conj_Cint // -Dn.
- by rewrite -mulr2n mulrC mulrA -mulr_natr mulNr -mulrBr.
- have{a_even} Da: (a == 0) || (a == 2%:R). (* Second part of (11.8.2). *)
- suffices (b := a - 1): b ^+ 2 == 1.
- by rewrite -!(can_eq (subrK 1) a) add0r addrK orbC -eqf_sqr expr1n.
- have S1gt0: (0 < size S1)%N by case: (S1) S1zeta.
- have: n * b ^+ 2 <= n *+ 3.
- have: 2%:R + n <= n *+ 3 by rewrite addrC ler_add2l ler_muln2r Dn ler1n.
- apply: ler_trans; rewrite sqrrB1 -mulr_natr -mulrBr mulrDr mulrA mulr1.
- rewrite ler_add2r -(ler_add2r (n ^+ 2 + '[X])) !addrA -nY -cfnormDd //.
- by rewrite -Dphi norm_FTtype345_bridge ?S1_1 // ler_addl cfnorm_ge0.
- have Zb: b \in Cint by rewrite rpredB ?rpred1 ?Za.
- have nz_b: b != 0 by rewrite subr_eq0 (memPn _ a a_even) ?(dvdC_nat 2 1).
- rewrite eqr_le sqr_Cint_ge1 {nz_b}//= andbT -Cint_normK // Dn -mulrnA.
- have /CnatP[m ->] := Cnat_norm_Cint Zb; rewrite -natrX -natrM leC_nat.
- by rewrite leq_pmul2l // lern1 -ltnS (ltn_sqr m 2) (leq_sqr m 1).
- have{nY Da} defX: X = eta_ i j - eta_ i 0. (* Last part of (11.8.2). *)
- have{nY Da} /eqP-nY: '[Y] == n ^+ 2.
- by rewrite -subr_eq0 nY addrK -mulrA !mulf_eq0 !subr_eq0 Da orbT.
- have coh_zeta_phi := FTtype345_bridge_coherence _ _ Szeta _ coh_tau1.
- have:= Dphi; rewrite addrC => /coh_zeta_phi->; rewrite ?S1_1 ?deltaZ //.
- rewrite defY scaler_sumr big_seq rpredB ?rpred_sum // => [xi Sxi|].
- by rewrite rpredZ_Cint ?mem_zchar ?map_f.
- by rewrite Dn rpredZnat ?mem_zchar ?map_f.
- have{col0_beta} a0: a = 0. (* This is the conclusion of (11.8.5). *)
- rewrite cfdot_suml big1 // in col0_beta => k _.
- rewrite -(betaE i j) // /beta_ -/phi Dphi -defX addrK defY subrK.
- rewrite cfdotZr cfdot_sumr big1_seq ?mulr0 // => xi S1xi.
- by rewrite cfdotC oS1eta ?conjC0.
- by rewrite Dphi defY defX a0 ?inE ?eqxx // scale0r sub0r addrC.
-(* This is step (11.8.6). *)
-pose theta := mu_ j - d%:R *: zeta.
-have /andP/=[red_muj S2muj]: mu_ j \in [predD S2 & irr M].
- by rewrite memS2red image_f.
-have HUtheta: theta \in 'CF(M, HU^#).
- rewrite cfun_onD1 !cfunE mu_1 ?S1_1 // Dd mulrC natrM subrr eqxx.
- by rewrite rpredB ?rpredZ ?(seqInd_on _ S1zeta) ?(seqInd_on _ S2muj).
-have Dtheta: theta = mu_ 0 - zeta + \sum_i alpha_ i j.
- rewrite !sumrB -scaler_sumr delta1 scale1r.
- rewrite [X in _ = X]addrC -!addrA -/(mu_ 0); congr (_ + _).
- rewrite [X in _ = _ + X]addrC !addrA addNr add0r -opprD; congr (- _).
- rewrite sumr_const nirrW1 -scaler_nat scalerA mulrC.
- by rewrite divfK ?neq0CG // delta1 addrC scalerBl scale1r subrK.
-have tau_theta: tau theta = eta_col j - d%:R *: zeta1.
- pose psi1 i := eta_ i j1 - eta_ i 0 - n *: zeta1.
- have Dpsi1 i: tau (alpha_ i j) = psi1 i by apply: tau_alpha.
- rewrite Dtheta [tau _]raddfD raddf_sum (eq_bigr psi1) //= {Dpsi1}/psi1 -/psi.
- rewrite Dpsi !sumrB [X in X = _]addrC -!addrA; congr (_ + _).
- rewrite -opprB -opprD -opprB -/(eta_col 0) addrA addrK; congr (- _).
- rewrite sumr_const nirrW1 -scaler_nat scalerA mulrC.
- by rewrite divfK ?neq0CG // delta1 scalerBl scale1r subrK.
-have [tau2 coh_tau2] := cohS2.
-without loss tau2muj: tau2 coh_tau2 / tau2 (mu_ j) = eta_col j; last first.
- case: FTtype34_noncoherence; rewrite H0_1 -joinGE join1G.
- have uS12: uniq (S2 ++ S1).
- by rewrite cat_uniq ?seqInd_uniq ?andbT //=; apply/hasPn.
- have /perm_eq_coherent: perm_eq (S2 ++ S1) (S_ C); last apply.
- apply: uniq_perm_eq; rewrite ?seqInd_uniq // => xi; rewrite mem_cat.
- apply/idP/idP=> [/orP | /seqIndP[i /setDP[kCi k'HUi] ->]].
- by case; apply/seqIndS/Iirr_kerDS; rewrite ?joing_subr.
- by rewrite !mem_seqInd // inE orbC inE kCi k'HUi andbT orbN.
- move: tau_theta; rewrite -tau2muj // -raddfZnat.
- apply: (bridge_coherent scohM) sS20 coh_tau2 sS10 coh_tau1 sS1S2' _.
- by rewrite (cfun_onS _ HUtheta) ?setSD // rpredZnat ?Z_S1.
-move=> IHtau2; apply: (IHtau2 tau2 coh_tau2); have [IZtau2 Dtau2] := coh_tau2.
-have{IHtau2} /hasP[xi S2xi /=irr_xi]: has [mem irr M] S2.
- apply/hasPn=> redS2 {tau2 coh_tau2 IZtau2 Dtau2}.
- have muS2: {subset S2 <= Smu} by move=> xi S2xi; rewrite -memS2red !inE redS2.
- have [_ [tau2 tau2mu coh_tau2]] := uniform_prTIred_coherent pddM nz_j1.
- have S2uniform: {subset S2 <= uniform_prTIred_seq pddM j}.
- move=> _ /muS2/imageP[k nz_k ->]; apply: image_f.
- by rewrite !inE [_ != 0]nz_k /= !mu_1.
- apply: (IHtau2 tau2); first exact: subset_coherent_with coh_tau2.
- have [_ /(_ _ nz_j1) Ez _ _] := FTtype345_constants maxM MtypeP notMtype2.
- by have:= tau2mu j; rewrite Ez -/delta delta1 scale1r.
-suffices: '[tau2 (mu_ j), eta_col j] != 0.
- have:= FTtypeP_coherent_TIred sS20 coh_tau2 irr_xi S2xi S2muj.
- case=> _ -> [[-> ->] | [-> -> _] /eqP[]]; first by rewrite deltaZ.
- rewrite -[cyclicTIiso _]/sigma cfdot_sumr big1 ?mulr0 // => i _.
- rewrite cfdotZl proj_col_eta -(inj_eq irr_inj) conjC_IirrE eq_sym.
- by rewrite odd_eq_conj_irr1 ?mFT_odd // irr_eq1 (negPf nz_j1) mulr0.
-pose gamma := xi 1%g *: mu_ j - mu_ j 1%g *: xi.
-have: '[tau2 gamma, tau theta] != 0.
- have [Txi Tzeta] := (seqInd_subT S2xi, seqInd_subT S1zeta).
- have S2gamma: gamma \in 'Z[S2, HU^#] by apply: sub_seqInd_zchar.
- rewrite Dtau2 ?zcharD1_seqInd //; move/zchar_on in S2gamma.
- rewrite Dade_isometry ?(cfun_onS sHU_A0) // cfdotBr cfdotZr !cfdotBl !cfdotZl.
- rewrite cfnorm_prTIred omuS1 // (seqInd_ortho _ _ S2muj) ?(memPn red_muj) //.
- rewrite (seqInd_ortho _ Txi) ?(memPn (sS1S2' _)) // !(mulr0, subr0) mulf_eq0.
- by rewrite char1_eq0 ?irrWchar // -cfnorm_eq0 irrWnorm ?oner_eq0 ?neq0CG.
-apply: contraNneq => o_muj_etaj; rewrite {}tau_theta !{gamma}raddfB subr_eq0 /=.
-have /CnatP[xi1 ->]: xi 1%g \in Cnat by rewrite Cnat_char1 ?irrWchar.
-rewrite mu_1 // cfdotZr !cfdotBl !raddfZnat !cfdotZl {}o_muj_etaj cfdot_sumr.
-have /orthogonalP oS2_S1: orthogonal (map tau2 S2) (map tau1 S1).
- exact: (coherent_ortho scohM) sS20 coh_tau2 sS10 coh_tau1 sS1S2'.
-rewrite !oS2_S1 ?map_f // big1 ?(mulr0, subr0) // => k _.
-exact: (coherent_ortho_cycTIiso _ _ coh_tau2).
-Qed.
-
-(* This is Peterfalvi (11.9). *)
-(* Note that in the proof of part (a), the text improperly suggests using *)
-(* (5.3.b) to show then tau (zeta - zeta^alpha) is orthogonal to the eta i j. *)
-(* Since alpha might not be conjugation, this is not obvious. Indeed the best *)
-(* way to derive this is to use (5.5) together with the coherence of S(HC). *)
-(* In part (c) we start by reducing the proof to q <= p - 1; we also don't *)
-(* compute [tau (mu0 - zeta), tau2 lambda] = [chi, tau2 lambda] since this *)
-(* is not needed to prove than u = a: one only needs to show that the *)
-(* the left-hand side is an integer, which is in fact required to show that *)
-(* the right-hand is an integer. *)
-Lemma FTtype34_structure (eta0row := \sum_j eta_ 0 j) :
- [/\ (*a*) {in S1, forall zeta, eq_proj_eta (tau (bridge0 zeta)) eta0row},
- (*b*) (p < q)%N
- & (*c*) FTtype M == 3 /\ typeP_Galois MtypeP].
-Proof.
-have sum_etaW F: \sum_(eta <- etaW) F eta = \sum_i \sum_j F (eta_ i j).
- rewrite big_map big_tuple (reindex (dprod_Iirr defW)) /=.
- by rewrite pair_bigA; apply: eq_bigr => -[i j].
- by exists (inv_dprod_Iirr defW) => ij; rewrite ?dprod_IirrK ?inv_dprod_IirrK.
-have bridgeS1: {in S1, forall zeta, eq_proj_eta (tau (bridge0 zeta)) eta0row}.
- move=> zeta S1zeta; set phi := bridge0 zeta; have irr_zeta := irrS1 S1zeta.
- have [X etaX [chi [Dchi oXchi o_chi_eta]]] := orthogonal_split etaW (tau phi).
- have [Isigma Zsigma] := cycTI_Zisometry ctiWG.
- have{o_chi_eta} o_chi_eta i j: '[chi, eta_ i j] = 0.
- by rewrite (orthoPl o_chi_eta) ?map_f ?mem_irr.
- have o1etaW: orthonormal etaW by rewrite map_orthonormal ?irr_orthonormal.
- have [a Da defX] := orthonormal_span o1etaW etaX; pose a_ := a (eta_ _ _).
- have{Da} Da i j: a_ i j = '[tau phi, eta_ i j].
- by rewrite Dchi cfdotDl o_chi_eta addr0 /a_ Da.
- have Zphi: phi \in 'Z[irr M, HU^#] by apply: Zbridge0.
- have A0phi: phi \in 'CF(M, 'A0(M)) by apply: A0bridge0.
- have a00_1 : a_ 0 0 = 1.
- rewrite Da cycTIirr00 [sigma 1]cycTIiso1.
- rewrite Dade_reciprocity // => [|x _ y _]; last by rewrite !cfun1E !inE.
- rewrite rmorph1 /= -(prTIirr00 ptiWM) -/(mu2_ 0 0) cfdotC.
- by rewrite cfdotBr cfdot_prTIirr_red omu2S1 // subr0 rmorph1.
- have aut_phi nu: cfAut nu (tau phi) = tau phi + tau (zeta - cfAut nu zeta).
- rewrite -Dade_aut !rmorphB !raddfB /= !addrA subrK.
- by rewrite -prTIred_aut aut_Iirr0.
- have Za i j: a_ i j \in Cint.
- rewrite Da Cint_cfdot_vchar ?cycTIiso_vchar //.
- by rewrite Dade_vchar ?(zchar_onS sHU_A0).
- have [tau1 coh_tau1] := cohS1; have [_ Dtau1] := coh_tau1.
- have o_tau1_eta := coherent_ortho_cycTIiso MtypeP sS10 coh_tau1.
- have a_aut nu i j: a (cfAut nu (eta_ i j)) = a_ i j.
- symmetry; transitivity '[cfAut nu (tau phi), cfAut nu (eta_ i j)].
- by rewrite cfdot_aut_vchar ?cycTIiso_vchar // -Da aut_Cint.
- rewrite aut_phi cfAut_cycTIiso -cycTIirr_aut [a _]Da cfdotDl addrC.
- rewrite -Dtau1 ?zcharD1_seqInd ?seqInd_sub_aut_zchar // raddfB cfdotBl.
- by rewrite !o_tau1_eta ?cfAut_seqInd ?cfAut_irr // subr0 add0r.
- pose a10 := a_ i1 0; pose a01 := a_ 0 j1; pose a11 := a_ i1 j1.
- have Da10 i: i != 0 -> a_ i 0 = a10.
- case/(cfExp_prime_transitive pr_q nz_i1) => k co_k_wi1 Dwi.
- rewrite -(cforder_dprodl defW) -dprod_IirrEl in co_k_wi1.
- have [[nu eta10nu] _] := cycTIiso_aut_exists ctiWG co_k_wi1.
- by rewrite /a_ dprod_IirrEl Dwi rmorphX /= -dprod_IirrEl eta10nu a_aut.
- have Da01 j: j != 0 -> a_ 0 j = a01.
- case/(cfExp_prime_transitive pr_p nz_j1) => k co_k_wj1 Dwj.
- rewrite -(cforder_dprodr defW) -dprod_IirrEr in co_k_wj1.
- have [[nu eta01nu] _] := cycTIiso_aut_exists ctiWG co_k_wj1.
- by rewrite /a_ dprod_IirrEr Dwj rmorphX /= -dprod_IirrEr eta01nu a_aut.
- have DaB1 i j: a_ i j = a_ i 0 + a_ 0 j - a_ 0 0.
- apply: (canRL (addrK _)); rewrite !Da cycTIiso_cfdot_exchange // => x Vx.
- have /setDP[A0x A'x]: x \in 'A0(M) :\: 'A(M).
- by rewrite (FTsupp0_typeP maxM MtypeP) // mem_class_support.
- by rewrite Dade_id // (cfun_on0 (zchar_on Zphi)) // -defA.
- pose p1 : algC := p.-1%:R; pose q1 : algC := q.-1%:R.
- have normX: '[X] = 1 + q1 * a10 ^+ 2 + p1 * a01 ^+ 2 + p1 * q1 * a11 ^+ 2.
- transitivity (\sum_i \sum_j a_ i j ^+ 2).
- rewrite defX cfnorm_sum_orthonormal // sum_etaW.
- by apply/eq_bigr=> i _; apply/eq_bigr=> j _; rewrite Cint_normK ?Za.
- rewrite -addrA addrACA (bigD1 0) //= (bigD1 0) //= a00_1 expr1n.
- rewrite -natrM !mulr_natl mulrnA -mulrnDl.
- rewrite -nirrW1 -nirrW2 -!(cardC1 0) -!sumr_const.
- congr (1 + _ + _); first by apply: eq_bigr => j /Da01->.
- apply: eq_bigr => i /Da10-Dai0; rewrite (bigD1 0) //= Dai0; congr (_ + _).
- by apply: eq_bigr => j /Da01-Da0j; rewrite DaB1 Dai0 Da0j -DaB1.
- have normX_le_q: '[X] <= q%:R.
- rewrite -(ler_add2r '[chi]) -cfnormDd // -Dchi -ler_subl_addl.
- have ->: '[tau phi] - q%:R = 1.
- rewrite Dade_isometry ?A0bridge0 // cfnormBd; last by rewrite omuS1.
- by rewrite cfnorm_prTIred cfdotS1 // eqxx addrC addKr.
- suffices: '[chi] != 0.
- suffices /CnatP[nchi ->]: '[chi] \in Cnat by rewrite ler1n lt0n -eqC_nat.
- rewrite Cnat_cfnorm_vchar // -(canLR (addKr _) Dchi) defX addrC rpredB //.
- by rewrite Dade_vchar // (zchar_onS (FTsupp_sub0 M)) ?defA.
- rewrite big_map big_seq rpred_sum // => _ /(cycTIirrP defW)[i [j ->]].
- by rewrite rpredZ_Cint ?Za ?cycTIiso_vchar.
- pose theta := zeta - zeta^*%CF.
- have Ztheta: theta \in 'Z[S1, HU^#] by apply: seqInd_sub_aut_zchar.
- have: '[tau phi, tau theta] != 0.
- rewrite Dade_isometry //; last by rewrite (cfun_onS _ (zchar_on Ztheta)).
- rewrite cfdotBl !cfdotBr ?omuS1 ?cfAut_seqInd // subr0 add0r oppr_eq0.
- rewrite irrWnorm // (seqInd_conjC_ortho _ _ _ S1zeta) ?mFT_odd //.
- by rewrite subr0 oner_eq0.
- rewrite cfnorm_eq0 Dchi; apply: contraNneq => ->; rewrite addr0 defX.
- rewrite -Dtau1 ?zcharD1_seqInd //.
- rewrite cfdot_suml big_map big1_seq // => _ /(cycTIirrP defW)[i [j ->]].
- apply/eqP; rewrite cfdotC fmorph_eq0 cfdotZr raddfB cfdotBl.
- by rewrite !o_tau1_eta ?cfAut_seqInd ?cfAut_irr // subrr mulr0.
- have a2_ge0 i j: 0 <= a_ i j ^+ 2 by rewrite -realEsqr Creal_Cint.
- have a11_0: a11 = 0.
- have: ('[X] < (2 * q.-1)%:R).
- rewrite (ler_lt_trans normX_le_q) // ltC_nat -subn1 mulnBr ltn_subRL.
- by rewrite !mul2n -!addnn ltn_add2r odd_prime_gt2 ?mFT_odd.
- apply: contraTeq => nz_a11; rewrite ler_gtF // normX ler_paddl //.
- by rewrite !mulr_natl ?addr_ge0 ?ler01 ?mulrn_wge0 ?a2_ge0.
- rewrite -mulr_natl -natrM ?ler_pmul ?natr_ge0 ?sqr_Cint_ge1 ?Za //.
- by rewrite leC_nat leq_mul // -subn1 ltn_subRL odd_prime_gt2 ?mFT_odd.
- rewrite a11_0 expr0n /= mulr0 addr0 in normX.
- have a10_a01: a10 + a01 = 1.
- by apply/eqP; rewrite -subr_eq0 -a00_1 -DaB1 -/a11 a11_0.
- have{o_chi_eta} o_chi_eta: orthogonal chi etaW.
- by apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i [j ->]] ->].
- have a10_0: a10 = 0.
- apply: contraNeq (FTtype34_not_ortho_cycTIiso S1zeta) => nz_a10.
- have a01_0: a01 = 0.
- apply: contraTeq normX_le_q => nz_a01; rewrite normX ltr_geF //.
- rewrite ltr_spaddr 1?mulr_gt0 ?ltr0n -?subn1 ?subn_gt0 ?prime_gt1 //.
- by rewrite ltr_def sqrf_eq0 nz_a01 a2_ge0.
- rewrite -ler_subl_addl -(natrB _ (prime_gt0 pr_q)) subn1 -mulr_natl.
- by rewrite ler_wpmul2l ?ler0n // sqr_Cint_ge1 ?Za.
- suffices <-: X = eta_col 0 by rewrite Dchi /eq_proj_eta addrC addKr.
- rewrite defX sum_etaW exchange_big (bigD1 0) //= addrC.
- rewrite big1 ?add0r => [|j nz_j]; first apply: eq_bigr => i _; last first.
- rewrite (bigD1 0) // [a _]Da01 //= a01_0 scale0r add0r big1 // => i nz_i.
- by rewrite [a _]DaB1 Da10 // Da01 // a10_a01 a00_1 subrr scale0r.
- have [-> | nz_i] := eqVneq i 0; first by rewrite [a _]a00_1 scale1r.
- by rewrite [a _]Da10 // (canRL (addrK _) a10_a01) a01_0 subr0 scale1r.
- suffices <-: X = eta0row by rewrite Dchi /eq_proj_eta addrC addKr.
- rewrite defX sum_etaW (bigD1 0) //= addrC.
- rewrite big1 ?add0r => [|i nz_i]; first apply: eq_bigr => j _; last first.
- rewrite (bigD1 0) // [a _]Da10 //= a10_0 scale0r add0r big1 // => j nz_j.
- by rewrite [a _]DaB1 Da10 // Da01 // a10_a01 a00_1 subrr scale0r.
- have [-> | nz_j] := eqVneq j 0; first by rewrite [a _]a00_1 scale1r.
- by rewrite [a _]Da01 // (canRL (addKr _) a10_a01) a10_0 oppr0 add0r scale1r.
-have [zeta [irr_zeta Szeta zeta1]] := FTtypeP_ref_irr maxM MtypeP.
-have{zeta1} [S1zeta zeta1]: zeta \in S1 /\ zeta 1%g = q%:R.
- split=> //; have [k nz_k Dzeta] := seqIndC1P Szeta.
- rewrite Dzeta mem_seqInd // !inE subGcfker nz_k -defM'' lin_char_der1 //.
- rewrite -mulr_natl Dzeta cfInd1 //= -(index_sdprod defM) in zeta1.
- by apply/andP; rewrite irr_char -(mulfI _ zeta1) ?neq0CG.
-have{Szeta} ltpq: (p < q)%N.
- rewrite ltn_neqAle neq_pq leqNgt /=.
- apply: contra (FTtype34_not_ortho_cycTIiso S1zeta) => ltqp.
- case/(FTtype345_Dade_bridge0 _ MtypeP): Szeta => // chi [-> _ _ o_chi_eta].
- rewrite /eq_proj_eta addrC addKr (orthogonal_oppl chi).
- by apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i [j ->]] ->].
-suffices galM: typeP_Galois MtypeP.
- have [_ [_ _ _ [/= cycUbar _ _]]] := typeP_Galois_P maxM notMtype5 galM.
- have{cycUbar} cycUbar: cyclic (U / U') by rewrite -defU' -defC.
- have nilU: nilpotent U by have [_ []] := MtypeP.
- case/orP: Mtype34 => // /(compl_of_typeIV maxM MtypeP)[_ /negP[]].
- exact/cyclic_abelian/cyclic_nilpotent_quo_der1_cyclic.
-apply: contraLR ltpq => gal'M; rewrite -leqNgt (leq_trans _ (leq_pred _)) //.
-have [_ _ _] := typeP_nonGalois_characters maxM notMtype5 gal'M.
-case: (_ gal'M) => H1 /= [_ _ nH1U _ []]; set a := #|U : _| => a_gt1.
-rewrite def_p -/q -defU' -defS2 => a_dv_p1 cycUhat _.
-set irr_qa := [pred lambda in irr M | lambda 1%g == (q * a)%:R] => S2_qa.
-have{S2_qa}/hasP[lambda S2lambda /andP[irr_lambda /eqP-lambda1]]: has irr_qa S2.
- have [a2_dv_pu] := S2_qa; rewrite has_count; apply: leq_trans.
- rewrite -(@ltn_pmul2r (a ^ 2 * #|C|)); last first.
- by rewrite !muln_gt0 (ltnW a_gt1) cardG_gt0.
- by rewrite mul0n divnK // muln_gt0 cardG_gt0 -subn1 subn_gt0 prime_gt1.
-have{nH1U cycUhat} a_dv_u: a %| u.
- rewrite /u card_quotient ?normal_norm // indexgS // defU'.
- rewrite der1_min ?cyclic_abelian // normsI ?normG //.
- by rewrite (subset_trans nH1U) // astab_norm.
-pose j := j1; pose psi := mu_ j - (u %/ a)%:R *: lambda.
-have /andP/=[red_muj S2muj]: mu_ j \in [predD S2 & irr M].
- by rewrite memS2red image_f.
-have S2psi: psi \in 'Z[S2, M^#].
- rewrite zcharD1E rpredB ?rpredZnat ?mem_zchar //=.
- by rewrite !cfunE mu_1 // lambda1 -natrM mulnCA divnK ?subrr.
-pose phi := tau (mu_ 0 - zeta).
-have o_phi_psi: '[phi, tau psi] = 0.
- have Apsi: psi \in 'CF(M, 'A(M)) by rewrite defA (zcharD1_seqInd_on _ S2psi).
- have [Tzeta Tlambda] := (seqInd_subT S1zeta, seqInd_subT S2lambda).
- rewrite Dade_isometry ?A0bridge0 ?(cfun_onS (FTsupp_sub0 M)) //.
- rewrite cfdotBl !cfdotBr !cfdotZr cfdot_prTIred eq_sym (negPf nz_j1) add0r.
- rewrite !(seqInd_ortho _ Tzeta) ?Tmu ?(memPnC (sS1S2' S1zeta)) // add0r.
- rewrite (seqInd_ortho _ (Tmu 0)) ?(memPnC (prTIred_not_irr _ _)) // !mulr0.
- by rewrite subrr.
-have [tau2 coh_tau2] := cohS2; have [[_ Ztau2] Dtau2] := coh_tau2.
-have ua_1: (u %/ a)%:R * `|'[phi, tau2 lambda]| == 1.
- rewrite -normr_nat -normrM mulr_natl -!raddfMn -[_ *+ _](subrK (mu_ j)) /=.
- rewrite -opprB addrC raddfB cfdotBr -scaler_nat (Dtau2 _ S2psi) o_phi_psi.
- case: (FTtypeP_coherent_TIred _ coh_tau2 _ S2lambda S2muj) => // -[b k] -> _.
- rewrite -/(eta_col k) cfdotZr rmorph_sign subr0 normrMsign.
- rewrite -[phi](subrK eta0row) cfdotDl cfdot_sumr big1 => [|j' _]; last first.
- by rewrite (orthoPl (bridgeS1 _ _)) ?map_f ?mem_irr.
- rewrite add0r cfdotC norm_conjC cfdot_sumr (bigD1 k) //= proj_col_eta eqxx.
- by rewrite big1 ?addr0 ?normr1 // => i k'i; rewrite proj_col_eta (negPf k'i).
-have Du: u = a.
- apply/eqP; rewrite -[a]mul1n eqn_mul ?(ltnW a_gt1) // -eqC_nat.
- move: ua_1; rewrite Cnat_mul_eq1 ?rpred_nat //; first by case/andP.
- rewrite Cnat_norm_Cint ?Cint_cfdot_vchar //; last by rewrite Ztau2 ?mem_zchar.
- rewrite Dade_vchar // zchar_split A0bridge0 //.
- by rewrite rpredB ?char_vchar ?prTIred_char ?irrWchar.
-have lequ: (q <= u)%N.
- have u1_gt0: (0 < u.-1)%N by rewrite -subn1 subn_gt0 Du.
- rewrite (leq_trans _ (leq_pred u)) // dvdn_leq //.
- suffices ->: q = #|W1 / C|%g by apply: Frobenius_dvd_ker1 frobUW1bar.
- apply/card_isog/quotient_isog; first by have [] := joing_subP nC_UW1.
- by rewrite setIAC (coprime_TIg coUq) setI1g.
-by rewrite (leq_trans lequ) // Du dvdn_leq // -subn1 subn_gt0 prime_gt1.
-Qed.
-
-End Eleven.