diff options
| author | Enrico Tassi | 2018-04-17 16:57:13 +0200 |
|---|---|---|
| committer | Enrico Tassi | 2018-04-17 16:57:13 +0200 |
| commit | eaa90cf9520e43d0b05fc6431a479e6b9559ef0e (patch) | |
| tree | 8499953a468a8d8be510dd0d60232cbd8984c1ec /mathcomp/odd_order/BGsection7.v | |
| parent | c1ec9cd8e7e50f73159613c492aad4c6c40bc3aa (diff) | |
move odd_order to its own repository
Diffstat (limited to 'mathcomp/odd_order/BGsection7.v')
| -rw-r--r-- | mathcomp/odd_order/BGsection7.v | 979 |
1 files changed, 0 insertions, 979 deletions
diff --git a/mathcomp/odd_order/BGsection7.v b/mathcomp/odd_order/BGsection7.v deleted file mode 100644 index 08a589e..0000000 --- a/mathcomp/odd_order/BGsection7.v +++ /dev/null @@ -1,979 +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 div fintype bigop. -From mathcomp -Require Import finset prime fingroup morphism automorphism action quotient. -From mathcomp -Require Import gfunctor cyclic pgroup center commutator gseries nilpotent. -From mathcomp -Require Import sylow abelian maximal hall. -From mathcomp -Require Import BGsection1 BGsection6. - -(******************************************************************************) -(* This file covers B & G, section 7, i.e., the proof of the Thompson *) -(* Transitivity Theorem, as well as some generalisations used later in the *) -(* proof. *) -(* This is the first section of the proof that applies to a (hypothetical) *) -(* minimally simple odd group, so we also introduce at this point some *) -(* infrastructure to carry over this assumption into the rest of the proof. *) -(* minSimpleOddGroupType == a finGroupType that ranges exactly over the *) -(* elements of a minimal counter-example to the *) -(* Odd Order Theorem. *) -(* G == the group of all the elements in a *) -(* minSimpleOddGroupType (this is a local notation *) -(* that must be reestablished for each such Type). *) -(* 'M == the set of all (proper) maximal subgroups of G *) -(* 'M(H) == the set of all elements of 'M that contain H *) -(* 'U == the set of all H such that 'M(H) contains a *) -(* single (unique) maximal subgroup of G. *) -(* 'SCN_n[p] == the set of all SCN subgroups of rank at least n *) -(* of all the Sylow p-subgroups of G. *) -(* |/|_H(A, pi) == the set of all pi-subgroups of H that are *) -(* normalised by A. *) -(* |/|*(A, pi) == the set of pi-subgroups of G, normalised by A, *) -(* and maximal subject to this condition. *) -(* normed_constrained A == A is a nontrivial proper subgroup of G, such *) -(* that for any proper subgroup X containing A, *) -(* all Y in |/|_X(A, pi') lie in the pi'-core of X *) -(* (here pi is the set of prime divisors of #|A|). *) -(* This is Hypothesis 7.1 in B & G. *) -(******************************************************************************) - -Set Implicit Arguments. -Unset Strict Implicit. -Unset Printing Implicit Defensive. - -Import GroupScope. - -Reserved Notation "''M'" (at level 8, format "''M'"). -Reserved Notation "''M' ( H )" (at level 8, format "''M' ( H )"). -Reserved Notation "''U'" (at level 8). -Reserved Notation "''SCN_' n [ p ]" - (at level 8, n at level 2, format "''SCN_' n [ p ]"). -Reserved Notation "|/|_ X ( A ; pi )" - (at level 8, X at level 2, format "|/|_ X ( A ; pi )"). -Reserved Notation "|/|* ( A ; pi )" - (at level 8, format "|/|* ( A ; pi )"). - -(* The generic setup for the whole Odd Order Theorem proof. *) -Section InitialReduction. - -Implicit Type gT : finGroupType. - -Record minSimpleOddGroupMixin gT : Prop := MinSimpleOddGroupMixin { - _ : odd #|[set: gT]|; - _ : simple [set: gT]; - _ : ~~ solvable [set: gT]; - _ : forall M : {group gT}, M \proper [set: gT] -> solvable M -}. - -Structure minSimpleOddGroupType := MinSimpleOddGroupType { - minSimpleOddGroupType_base :> finGroupType; - _ : minSimpleOddGroupMixin minSimpleOddGroupType_base -}. - -Hypothesis IH_FT : minSimpleOddGroupType -> False. - -Lemma minSimpleOdd_ind gT (G : {group gT}) : odd #|G| -> solvable G. -Proof. -move: {2}_.+1 (ltnSn #|G|) => n. -elim: n => // n IHn in gT G *; rewrite ltnS => leGn oddG. -have oG: #|[subg G]| = #|G| by rewrite (card_isog (isog_subg G)). -apply/idPn=> nsolG; case: IH_FT; exists [finGroupType of subg_of G]. -do [split; rewrite ?oG //=] => [||M]. -- rewrite -(isog_simple (isog_subg _)); apply/simpleP; split=> [|H nsHG]. - by apply: contra nsolG; move/eqP->; rewrite abelian_sol ?abelian1. - have [sHG _]:= andP nsHG; apply/pred2P; apply: contraR nsolG; case/norP=> ntH. - rewrite eqEcard sHG -ltnNge (series_sol nsHG) => ltHG. - by rewrite !IHn ?(oddSg sHG) ?quotient_odd ?(leq_trans _ leGn) ?ltn_quotient. -- by apply: contra nsolG => solG; rewrite -(im_sgval G) morphim_sol. -rewrite properEcard oG; case/andP=> sMG ltMG. -by apply: IHn (leq_trans ltMG leGn) (oddSg sMG _); rewrite oG. -Qed. - -Lemma minSimpleOdd_prime gT (G : {group gT}) : - odd #|G| -> simple G -> prime #|G|. -Proof. by move/minSimpleOdd_ind; apply: simple_sol_prime. Qed. - -End InitialReduction. - -Notation TheMinSimpleOddGroup gT := - [set: FinGroup.arg_sort (FinGroup.base (minSimpleOddGroupType_base gT))] - (only parsing). - -(* Elementary properties of the minimal counter example. *) -Section MinSimpleOdd. - -Variable gT : minSimpleOddGroupType. -Notation G := (TheMinSimpleOddGroup gT). -Implicit Types H K D M P U V X : {group gT}. -Local Notation sT := {set gT}. -Implicit Type p : nat. - -Lemma mFT_odd H : odd #|H|. -Proof. by apply: (oddSg (subsetT H)); case: gT => ? []. Qed. - -Lemma mFT_simple : simple G. -Proof. by case: gT => ? []. Qed. - -Lemma mFT_nonSolvable : ~~ solvable G. -Proof. by case: gT => ? []. Qed. - -Lemma mFT_sol M : M \proper G -> solvable M. -Proof. by case: gT M => ? []. Qed. - -Lemma mFT_nonAbelian : ~~ abelian G. -Proof. by apply: contra mFT_nonSolvable; apply: abelian_sol. Qed. - -Lemma mFT_neq1 : G != 1. -Proof. by apply: contraNneq mFT_nonAbelian => ->; apply: abelian1. Qed. - -Lemma mFT_gt1 : [1] \proper G. Proof. by rewrite proper1G mFT_neq1. Qed. - -Lemma mFT_quo_odd M H : odd #|M / H|. -Proof. by rewrite quotient_odd ?mFT_odd. Qed. - -Lemma mFT_sol_proper M : (M \proper G) = solvable M. -Proof. -apply/idP/idP; first exact: mFT_sol. -by rewrite properT; apply: contraL; move/eqP->; apply: mFT_nonSolvable. -Qed. - -Lemma mFT_pgroup_proper p P : p.-group P -> P \proper G. -Proof. by move/pgroup_sol; rewrite mFT_sol_proper. Qed. - -Lemma mFT_norm_proper H : H :!=: 1 -> H \proper G -> 'N(H) \proper G. -Proof. -move=> ntH; rewrite !properT; apply: contra; move/eqP=> nHG; apply/eqP. -move/eqP: ntH; case/simpleP: mFT_simple => _; case/(_ H) => //=. -by rewrite -nHG normalG. -Qed. - -Lemma cent_mFT_trivial : 'C(G) = 1. -Proof. -apply/eqP; apply: contraR mFT_nonAbelian => ntC. -rewrite /abelian subTset /= eqEproper subsetT /=; apply/negP=> prC. -have:= mFT_norm_proper ntC prC. -by rewrite /proper subsetT norms_cent ?normG. -Qed. - -Lemma mFT_cent_proper H : H :!=: 1 -> 'C(H) \proper G. -Proof. -case: (eqsVneq H G) => [-> | ]. - by rewrite cent_mFT_trivial properT eq_sym. -rewrite -properT => prH ntH; apply: sub_proper_trans (cent_sub H) _. -exact: mFT_norm_proper. -Qed. - -Lemma mFT_cent1_proper x : x != 1 -> 'C[x] \proper G. -Proof. by rewrite -cycle_eq1 -cent_cycle; apply: mFT_cent_proper. Qed. - -Lemma mFT_quo_sol M H : H :!=: 1 -> solvable (M / H). -Proof. -move=> ntH; case: (eqsVneq H G) => [-> |]. - rewrite [_ / _](trivgP _) ?abelian_sol ?abelian1 //. - by rewrite quotient_sub1 ?normsG ?subsetT. -rewrite -properT => prH; rewrite -quotientInorm morphim_sol //. -by apply: solvableS (subsetIr _ _) (mFT_sol _); rewrite mFT_norm_proper. -Qed. - -(* Maximal groups of the minimal FT counterexample, as defined at the start *) -(* of B & G, section 7. *) -Definition minSimple_max_groups := [set M : {group gT} | maximal M G]. -Local Notation "'M" := minSimple_max_groups : group_scope. - -Definition minSimple_max_groups_of (H : sT) := [set M in 'M | H \subset M]. -Local Notation "''M' ( H )" := (minSimple_max_groups_of H) : group_scope. - -Definition minSimple_uniq_max_groups := [set U : {group gT} | #|'M(U)| == 1%N]. -Local Notation "'U" := minSimple_uniq_max_groups : group_scope. - -Definition minSimple_SCN_at n p := \bigcup_(P in 'Syl_p(G)) 'SCN_n(P). - -Lemma mmax_exists H : H \proper G -> {M | M \in 'M(H)}. -Proof. -case/(@maxgroup_exists _ (fun M => M \proper G)) => M maxM sHM. -by exists M; rewrite !inE sHM andbT. -Qed. - -Lemma any_mmax : {M : {group gT} | M \in 'M}. -Proof. by have [M] := mmax_exists mFT_gt1; case/setIdP; exists M. Qed. - -Lemma mmax_proper M : M \in 'M -> M \proper G. -Proof. by rewrite inE; apply: maxgroupp. Qed. - -Lemma mmax_sol M : M \in 'M -> solvable M. -Proof. by move/mmax_proper/mFT_sol. Qed. - -Lemma mmax_max M H : M \in 'M -> H \proper G -> M \subset H -> H :=: M. -Proof. by rewrite inE; case/maxgroupP=> _; apply. Qed. - -Lemma eq_mmax : {in 'M &, forall M H, M \subset H -> M :=: H}. -Proof. by move=> M H Mmax; move/mmax_proper=> prH; move/mmax_max->. Qed. - -Lemma sub_mmax_proper M H : M \in 'M -> H \subset M -> H \proper G. -Proof. by move=> maxM sHM; apply: sub_proper_trans (mmax_proper maxM). Qed. - -Lemma mmax_norm X M : - M \in 'M -> X :!=: 1 -> X \proper G -> M \subset 'N(X) -> 'N(X) = M. -Proof. by move=> maxM ntX prX; apply: mmax_max (mFT_norm_proper _ _). Qed. - -Lemma mmax_normal_subset A M : - M \in 'M -> A <| M -> ~~ (A \subset [1]) -> 'N(A) = M. -Proof. -rewrite -gen_subG subG1 => maxM /andP[sAM nAM] ntGA. -rewrite (mmax_max maxM) // (sub_proper_trans (norm_gen _)) ?mFT_norm_proper //. -by rewrite (sub_mmax_proper maxM) // gen_subG. -Qed. - -Lemma mmax_normal M H : M \in 'M -> H <| M -> H :!=: 1 -> 'N(H) = M. -Proof. by rewrite -subG1; apply: mmax_normal_subset. Qed. - -Lemma mmax_sigma_Sylow p P M : - M \in 'M -> p.-Sylow(M) P -> 'N(P) \subset M -> p.-Sylow(G) P. -Proof. -by move=> maxM sylP sNM; rewrite -Sylow_subnorm setTI (pHall_subl _ sNM) ?normG. -Qed. - -Lemma mmax_neq1 M : M \in 'M -> M :!=: 1. -Proof. -move=> maxM; apply: contra mFT_nonAbelian; move/eqP=> M1. -case: (eqVneq G 1) => [-> | ]; first exact: abelian1. -case/trivgPn=> x; rewrite -cycle_subG -cycle_eq1 subEproper /=. -case/predU1P=> [<- | ]; first by rewrite cycle_abelian. -by move/(mmax_max maxM)=> ->; rewrite M1 ?sub1G ?eqxx. -Qed. - -Lemma norm_mmax M : M \in 'M -> 'N(M) = M. -Proof. -move=> maxM; apply: mmax_max (normG M) => //. -exact: (mFT_norm_proper (mmax_neq1 maxM) (mmax_proper maxM)). -Qed. - -Lemma mmaxJ M x : (M :^ x \in 'M)%G = (M \in 'M). -Proof. by rewrite !inE /= -{1}[G](@conjGid _ _ x) ?maximalJ ?inE. Qed. - -Lemma mmax_ofS H K : H \subset K -> 'M(K) \subset 'M(H). -Proof. -move=> sHK; apply/subsetP=> M; rewrite !inE => /andP[->]. -exact: subset_trans. -Qed. - -Lemma mmax_ofJ K x M : ((M :^ x)%G \in 'M(K :^ x)) = (M \in 'M(K)). -Proof. by rewrite inE mmaxJ conjSg !inE. Qed. - -Lemma uniq_mmaxP U : reflect (exists M, 'M(U) = [set M]) (U \in 'U). -Proof. by rewrite inE; apply: cards1P. Qed. -Arguments uniq_mmaxP [U]. - -Lemma mem_uniq_mmax U M : 'M(U) = [set M] -> M \in 'M /\ U \subset M. -Proof. by move/setP/(_ M); rewrite set11 => /setIdP. Qed. - -Lemma eq_uniq_mmax U M H : - 'M(U) = [set M] -> H \in 'M -> U \subset H -> H :=: M. -Proof. -by move=> uU_M maxH sUH; apply/congr_group/set1P; rewrite -uU_M inE maxH. -Qed. - -Lemma def_uniq_mmax U M : - U \in 'U -> M \in 'M -> U \subset M -> 'M(U) = [set M]. -Proof. -case/uniq_mmaxP=> D uU_D maxM sUM. -by rewrite (group_inj (eq_uniq_mmax uU_D maxM sUM)). -Qed. - -Lemma uniq_mmax_subset1 U M : - M \in 'M -> U \subset M -> (U \in 'U) = ('M(U) \subset [set M]). -Proof. -move=> maxM sUM; apply/idP/idP=> uU; first by rewrite -(def_uniq_mmax uU). -by apply/uniq_mmaxP; exists M; apply/eqP; rewrite eqEsubset uU sub1set inE maxM. -Qed. - -Lemma sub_uniq_mmax U M H : - 'M(U) = [set M] -> U \subset H -> H \proper G -> H \subset M. -Proof. -move=> uU_M sUH; case/mmax_exists=> D; case/setIdP=> maxD sHD. -by rewrite -(eq_uniq_mmax uU_M maxD) ?(subset_trans sUH). -Qed. - -Lemma mmax_sup_id M : M \in 'M -> 'M(M) = [set M]. -Proof. -move=> maxM; apply/eqP; rewrite eqEsubset sub1set inE maxM subxx !andbT. -apply/subsetP=> H; case/setIdP=> maxH; rewrite inE -val_eqE /=. -by move/eq_mmax=> ->. -Qed. - -Lemma mmax_uniq_id : {subset 'M <= 'U}. -Proof. by move=> M maxM; apply/uniq_mmaxP; exists M; apply: mmax_sup_id. Qed. - -Lemma def_uniq_mmaxJ M K x : 'M(K) = [set M] -> 'M(K :^ x) = [set M :^ x]%G. -Proof. -move=> uK_M; apply/setP=> L; rewrite -(actKV 'JG x L) mmax_ofJ uK_M. -by rewrite !inE (inj_eq (act_inj 'JG x)). -Qed. - -Lemma uniq_mmaxJ K x :((K :^ x)%G \in 'U) = (K \in 'U). -Proof. -apply/uniq_mmaxP/uniq_mmaxP=> [] [M uK_M]. - by exists (M :^ x^-1)%G; rewrite -(conjsgK x K); apply: def_uniq_mmaxJ. -by exists (M :^ x)%G; apply: def_uniq_mmaxJ. -Qed. - -Lemma uniq_mmax_norm_sub (M U : {group gT}) : - 'M(U) = [set M] -> 'N(U) \subset M. -Proof. -move=> uU_M; have [maxM _] := mem_uniq_mmax uU_M. -apply/subsetP=> x nUx; rewrite -(norm_mmax maxM) inE. -have:= set11 M; rewrite -uU_M -(mmax_ofJ _ x) (normP nUx) uU_M. -by move/set1P/congr_group->. -Qed. - -Lemma uniq_mmax_neq1 (U : {group gT}) : U \in 'U -> U :!=: 1. -Proof. -case/uniq_mmaxP=> M uU_M; have [maxM _] := mem_uniq_mmax uU_M. -apply: contraL (uniq_mmax_norm_sub uU_M); move/eqP->. -by rewrite norm1 subTset -properT mmax_proper. -Qed. - -Lemma def_uniq_mmaxS M U V : - U \subset V -> V \proper G -> 'M(U) = [set M] -> 'M(V) = [set M]. -Proof. -move=> sUV prV uU_M; apply/eqP; rewrite eqEsubset sub1set -uU_M. -rewrite mmax_ofS //= inE (sub_uniq_mmax uU_M) //. -by case/mem_uniq_mmax: uU_M => ->. -Qed. - -Lemma uniq_mmaxS U V : U \subset V -> V \proper G -> U \in 'U -> V \in 'U. -Proof. -move=> sUV prV /uniq_mmaxP[M uU_M]; apply/uniq_mmaxP; exists M. -exact: def_uniq_mmaxS uU_M. -Qed. - -End MinSimpleOdd. - -Arguments uniq_mmaxP [gT U]. -Prenex Implicits uniq_mmaxP. - -Notation "''M'" := (minSimple_max_groups _) : group_scope. -Notation "''M' ( H )" := (minSimple_max_groups_of H) : group_scope. -Notation "''U'" := (minSimple_uniq_max_groups _) : group_scope. -Notation "''SCN_' n [ p ]" := (minSimple_SCN_at _ n p) : group_scope. - -Section Hypothesis7_1. - -Variable gT : finGroupType. -Implicit Types X Y A P Q : {group gT}. -Local Notation G := [set: gT]. - -Definition normed_pgroups (X A : {set gT}) pi := - [set Y : {group gT} | pi.-subgroup(X) Y & A \subset 'N(Y)]. -Local Notation "|/|_ X ( A ; pi )" := (normed_pgroups X A pi) : group_scope. - -Definition max_normed_pgroups (A : {set gT}) pi := - [set Y : {group gT} | [max Y | pi.-group Y & A \subset 'N(Y)]]. -Local Notation "|/|* ( A ; pi )" := (max_normed_pgroups A pi) : group_scope. - -(* This is the statement for B & G, Hypothesis 7.1. *) -Inductive normed_constrained (A : {set gT}) := - NormedConstrained (pi := \pi(A)) of A != 1 & A \proper G - & forall X Y : {group gT}, - A \subset X -> X \proper G -> Y \in |/|_X(A; pi^') -> Y \subset 'O_pi^'(X). - -Variable pi : nat_pred. - -Lemma max_normed_exists A X : - pi.-group X -> A \subset 'N(X) -> {Y | Y \in |/|*(A; pi) & X \subset Y}. -Proof. -move=> piX nXA; pose piAn Y := pi.-group(Y) && (A \subset 'N(Y)). -have [|Y] := @maxgroup_exists _ piAn X; first by rewrite /piAn piX. -by exists Y; rewrite // inE. -Qed. - -Lemma mem_max_normed A X : X \in |/|*(A; pi) -> pi.-group X /\ A \subset 'N(X). -Proof. by rewrite inE; move/maxgroupp; move/andP. Qed. - -Lemma norm_acts_max_norm P : [acts 'N(P), on |/|*(P; pi) | 'JG]. -Proof. -apply/subsetP=> z Nz; rewrite !inE; apply/subsetP=> Q; rewrite !inE. -case/maxgroupP=> qQ maxQ; apply/maxgroupP; rewrite pgroupJ norm_conj_norm //. -split=> // Y; rewrite sub_conjg /= => qY; move/maxQ=> <-; rewrite ?conjsgKV //. -by rewrite pgroupJ norm_conj_norm ?groupV. -Qed. - -Lemma trivg_max_norm P : 1%G \in |/|*(P; pi) -> |/|*(P; pi) = [set 1%G]. -Proof. -move=> max1; apply/eqP; rewrite eqEsubset sub1set max1 andbT. -apply/subsetP=> Q; rewrite !inE -val_eqE /= in max1 *. -by case/maxgroupP: max1 => _ max1; move/maxgroupp; move/max1->; rewrite ?sub1G. -Qed. - -Lemma max_normed_uniq A P Q : - |/|*(A; pi) = [set Q] -> A \subset P -> P \subset 'N(Q) -> - |/|*(P; pi) = [set Q]. -Proof. -move=> defAmax sAP nQP; have: Q \in |/|*(A; pi) by rewrite defAmax set11. -rewrite inE; case/maxgroupP; case/andP=> piQ _ maxQ. -apply/setP=> X; rewrite !inE -val_eqE /=; apply/maxgroupP/eqP=> [[]|->{X}]. - case/andP=> piX nXP maxX; have nXA := subset_trans sAP nXP. - have [Y] := max_normed_exists piX nXA. - by rewrite defAmax; move/set1P->; move/maxX=> -> //; rewrite piQ. -rewrite piQ; split=> // X; case/andP=> piX nXP sQX. -by rewrite (maxQ X) // piX (subset_trans sAP). -Qed. - -End Hypothesis7_1. - -Notation "|/|_ X ( A ; pi )" := (normed_pgroups X A pi) : group_scope. -Notation "|/|* ( A ; pi )" := (max_normed_pgroups A pi) : group_scope. - -Section Seven. - -Variable gT : minSimpleOddGroupType. -Local Notation G := (TheMinSimpleOddGroup gT). -Local Notation grT := {group gT}. -Implicit Types H P Q R K M A B : grT. -Implicit Type p q : nat. - -Section NormedConstrained. - -Variables (q : nat) (A : grT). -Let pi := Eval simpl in \pi(A). -Let K := 'O_pi^'('C(A)). -Let nsKC : K <| 'C(A) := pcore_normal _ _. - -Lemma cent_core_acts_max_norm : [acts K, on |/|*(A; q) | 'JG]. -Proof. -by rewrite (subset_trans _ (norm_acts_max_norm _ _)) ?cents_norm ?pcore_sub. -Qed. -Let actsKmax := actsP cent_core_acts_max_norm. - -Hypotheses (cstrA : normed_constrained A) (pi'q : q \notin pi). - -Let hyp71 H R : - A \subset H -> H \proper G -> R \in |/|_H(A; pi^') -> R \subset 'O_pi^'(H). -Proof. by case: cstrA H R. Qed. - -(* This is the observation between B & G, Hypothesis 7.1 and Lemma 7.1. *) -Remark normed_constrained_Hall : pi^'.-Hall('C(A)) K. -Proof. -have [_ ntA prA _] := cstrA; rewrite -[setT]/G in prA. -rewrite /pHall pcore_pgroup pcore_sub pnatNK /=. -rewrite -card_quotient ?gFnorm //= -/K. -apply/pgroupP=> p p_pr; case/Cauchy=> // Kx; case/morphimP=> x Nx Cx ->{Kx}. -rewrite /order -quotient_cycle //= -/K => def_p; apply/idPn=> pi'p. -have [P sylP] := Sylow_exists p <[x]>; have [sPx pP _]:= and3P sylP. -suffices: P \subset K. - have nKP: P \subset 'N(K) by rewrite (subset_trans sPx) ?cycle_subG. - rewrite -quotient_sub1 //= -/K (sameP trivgP eqP) trivg_card1. - rewrite (card_Hall (morphim_pHall _ nKP sylP)) def_p part_pnat_id ?pnat_id //. - by case: eqP p_pr => // ->. -suffices sP_pAC: P \subset 'O_pi^'(A <*> 'C(A)). - rewrite (subset_trans sP_pAC) ?pcore_max ?pcore_pgroup //. - rewrite /normal gFnorm_trans ?normsG ?joing_subr // andbT. - rewrite -quotient_sub1; last first. - by rewrite gFsub_trans // join_subG !(normG, norms_cent). - rewrite /= -(setIidPr (pcore_sub _ _)) quotientGI ?joing_subr //=. - rewrite {1}cent_joinEr // quotientMidr coprime_TIg // coprime_morph //. - by rewrite coprime_pi' ?cardG_gt0 //= -/pi [pnat _ _]pcore_pgroup. -apply: hyp71; first exact: joing_subl. - apply: sub_proper_trans (mFT_norm_proper ntA prA). - by rewrite join_subG normG cent_sub. -have sPC: P \subset 'C(A) by rewrite (subset_trans sPx) ?cycle_subG. -rewrite inE /psubgroup cents_norm 1?centsC // andbT. -rewrite (subset_trans sPC) ?joing_subr //=. -by apply: sub_in_pnat pP => p' _; move/eqnP->. -Qed. -Let hallK := normed_constrained_Hall. - -(* This is B & G, Lemma 7.1. *) -Lemma normed_constrained_meet_trans Q1 Q2 H : - A \subset H -> H \proper G -> Q1 \in |/|*(A; q) -> Q2 \in |/|*(A; q) -> - Q1 :&: H != 1 -> Q2 :&: H != 1 -> - exists2 k, k \in K & Q2 :=: Q1 :^ k. -Proof. -move: {2}_.+1 (ltnSn (#|G| - #|Q1 :&: Q2|)) => m. -elim: m => // m IHm in H Q1 Q2 * => geQ12m sAH prHG maxQ1 maxQ2 ntHQ1 ntHQ2. -have:= maxQ1; rewrite inE => /maxgroupP[/andP[qQ1 nQ1A] maxQ1P]. -have:= maxQ2; rewrite inE => /maxgroupP[/andP[qQ2 nQ2A] maxQ2P]. -have prQ12: Q1 :&: Q2 \proper G. - rewrite properT; apply: contraNneq (mFT_nonSolvable gT) => <-. - by apply: pgroup_sol (pgroupS _ qQ1); rewrite subsetIl. -wlog defH: H prHG sAH ntHQ1 ntHQ2 / Q1 :&: Q2 != 1 -> H :=: 'N(Q1 :&: Q2). - case: (eqVneq (Q1 :&: Q2) 1) => [-> | ntQ12] IH. - by apply: (IH H) => //; case/eqP. - apply: (IH 'N(Q1 :&: Q2)%G); rewrite ?normsI ?mFT_norm_proper //; - apply: contra ntQ12; rewrite -!subG1; apply: subset_trans; - by rewrite subsetI normG (subsetIl, subsetIr). -pose L := 'O_pi^'(H); have sLH: L \subset H := pcore_sub _ _. -have [nLA coLA solL]: [/\ A \subset 'N(L), coprime #|L| #|A| & solvable L]. - rewrite gFnorm_trans ?normsG // coprime_sym coprime_pi' ?cardG_gt0 //. - by rewrite -pgroupE pcore_pgroup (solvableS sLH) ?mFT_sol. -have Qsyl Q: Q \in |/|*(A; q) -> Q :&: H != 1 -> - exists R : {group _}, [/\ q.-Sylow(L) R, A \subset 'N(R) & Q :&: H \subset R]. -- case/mem_max_normed=> qQ nQA ntQH. - have qQH: q.-group (Q :&: H) by rewrite (pgroupS _ qQ) ?subsetIl. - have nQHA: A \subset 'N(Q :&: H) by rewrite normsI // normsG. - apply: coprime_Hall_subset => //; apply: (hyp71) => //. - rewrite inE nQHA /psubgroup subsetIr andbT. - by apply: sub_in_pnat qQH => p _; move/eqnP->. -have [R1 [sylR1 nR1A sQR1]] := Qsyl _ maxQ1 ntHQ1. -have [R2 [sylR2 nR2A sQR2]] := Qsyl _ maxQ2 ntHQ2. -have [h Ch defR2] := coprime_Hall_trans nLA coLA solL sylR2 nR2A sylR1 nR1A. -have{Ch} [Hh Kh]: h \in H /\ h \in K. - case/setIP: Ch => Lh Ch; rewrite (subsetP sLH) //. - rewrite (mem_normal_Hall hallK (pcore_normal _ _)) //. - by rewrite (mem_p_elt _ Lh) ?pcore_pgroup. -have [Q3 maxQ3 sR2Q3] := max_normed_exists (pHall_pgroup sylR2) nR2A. -have maxQ1h: (Q1 :^ h)%G \in |/|*(A; q) by rewrite actsKmax. -case: (eqsVneq Q1 Q2) => [| neQ12]; first by exists 1; rewrite ?group1 ?conjsg1. -have ntHQ3: Q3 :&: H != 1. - by apply: subG1_contra ntHQ2; rewrite subsetI subsetIr (subset_trans sQR2). -have ntHQ1h: (Q1 :^ h) :&: H != 1. - by move: ntHQ1; rewrite !trivg_card1 -(cardJg _ h) conjIg (conjGid Hh). -suff [prI1 prI2]: Q1 :&: Q2 \proper Q1 :&: R1 /\ Q1 :&: Q2 \proper Q2 :&: R2. - have: #|G| - #|(Q1 :^ h) :&: Q3| < m. - rewrite ltnS in geQ12m; apply: leq_trans geQ12m. - rewrite ltn_sub2l ?(proper_card prQ12) // -(cardJg _ h) proper_card //. - by rewrite (proper_sub_trans _ (setIS _ sR2Q3)) // defR2 -conjIg properJ. - have: #|G| - #|Q3 :&: Q2| < m. - rewrite ltnS in geQ12m; apply: leq_trans geQ12m. - rewrite ltn_sub2l ?proper_card // (proper_sub_trans prI2) //. - by rewrite setIC setISS. - case/(IHm H) => // k2 Kk2 defQ2; case/(IHm H) => // k3 Kk3 defQ3. - by exists (h * k3 * k2); rewrite ?groupM ?conjsgM // -defQ3. -case: (eqVneq (Q1 :&: Q2) 1) => [-> | ntQ12]. - by rewrite !proper1G; split; [move: ntHQ1 | move: ntHQ2]; - apply: subG1_contra; rewrite subsetI subsetIl. -rewrite -(setIidPr (subset_trans (pHall_sub sylR1) sLH)) setIA. -rewrite -(setIidPr (subset_trans (pHall_sub sylR2) sLH)) setIA. -rewrite (setIidPl sQR1) (setIidPl sQR2) {}defH //. -have nilQ1 := pgroup_nil qQ1; have nilQ2 := pgroup_nil qQ2. -rewrite !nilpotent_proper_norm /proper ?subsetIl ?subsetIr ?subsetI ?subxx //=. - by rewrite andbT; apply: contra neQ12 => sQ21; rewrite (maxQ2P Q1) ?qQ1. -by apply: contra neQ12 => sQ12; rewrite (maxQ1P Q2) ?qQ2. -Qed. - -(* This is B & G, Theorem 7.2. *) -Theorem normed_constrained_rank3_trans : - 'r('Z(A)) >= 3 -> [transitive K, on |/|*(A; q) | 'JG]. -Proof. -case/rank_geP=> B /nElemP[p]; rewrite !inE subsetI -2!andbA. -case/and4P=> sBA cAB abelB mB3; have [_ cBB _] := and3P abelB. -have q'B: forall Q, q.-group Q -> coprime #|Q| #|B|. - move=> Q qQ; rewrite coprime_sym (coprimeSg sBA) ?coprime_pi' //. - exact: pi_pnat qQ _. -have [Q1 maxQ1 _] := max_normed_exists (pgroup1 _ q) (norms1 A). -apply/imsetP; exists Q1 => //; apply/setP=> Q2. -apply/idP/imsetP=> [maxQ2|[k Kk] ->]; last by rewrite actsKmax. -have [qQ1 nQ1A]:= mem_max_normed maxQ1; have [qQ2 nQ2A]:= mem_max_normed maxQ2. -case: (eqVneq Q1 1%G) => [trQ1 | ntQ1]. - exists 1; rewrite ?group1 // act1; apply/eqP. - by rewrite trivg_max_norm -trQ1 // inE in maxQ2. -case: (eqVneq Q2 1%G) => [trQ2 | ntQ2]. - by case/negP: ntQ1; rewrite trivg_max_norm -trQ2 // inE in maxQ1 *. -have: [exists (C : grT | 'C_Q1(C) != 1), cyclic (B / C) && (C <| B)]. - apply: contraR ntQ1 => trQ1; have: B \subset 'N(Q1) := subset_trans sBA nQ1A. - rewrite -val_eqE -subG1 /=; move/coprime_abelian_gen_cent <-; rewrite ?q'B //. - rewrite gen_subG; apply/bigcupsP=> C cocyC; rewrite subG1. - by apply: contraR trQ1 => ntCC; apply/existsP; exists C; rewrite ntCC. -case/existsP=> C /and3P[ntCQ1 cycBC nsCB]; have [sCB nCB]:= andP nsCB. -have{mB3} ncycC: ~~ cyclic C. - rewrite (abelem_cyclic (quotient_abelem _ abelB)) ?card_quotient // in cycBC. - rewrite -divgS // logn_div ?cardSg // leq_subLR addn1 (eqP mB3) in cycBC. - by rewrite (abelem_cyclic (abelemS sCB abelB)) -ltnNge. -have: [exists (z | 'C_Q2[z] != 1), z \in C^#]. - apply: contraR ntQ2 => trQ2; have:= subset_trans sCB (subset_trans sBA nQ2A). - rewrite -[_ == _]subG1 /=. - move/coprime_abelian_gen_cent1 <-; rewrite ?(abelianS sCB) //; last first. - by rewrite (coprimegS sCB) ?q'B. - rewrite gen_subG; apply/bigcupsP=> z Cz. - by apply: contraR trQ2 => ntCz; apply/existsP; exists z; rewrite -subG1 ntCz. -case/existsP=> z; rewrite !inE => /and3P[ntzQ2 ntz Cz]. -have prCz: 'C[z] \proper G by rewrite -cent_cycle mFT_cent_proper ?cycle_eq1. -have sACz: A \subset 'C[z] by rewrite sub_cent1 (subsetP cAB) ?(subsetP sCB). -have [|//|k Kk defQ2]:= normed_constrained_meet_trans sACz prCz maxQ1 maxQ2. - by apply: subG1_contra ntCQ1; rewrite setIS //= -cent_cycle centS ?cycle_subG. -by exists k => //; apply: val_inj. -Qed. - -(* This is B & G, Theorem 7.3. *) -Theorem normed_constrained_rank2_trans : - q %| #|'C(A)| -> 'r('Z(A)) >= 2 -> [transitive K, on |/|*(A; q) | 'JG]. -Proof. -move=> qC /rank_geP[B /nElemP[p /setIdP[/setIdP[/subsetIP[sBA cAB] abelB] oB]]]. -have [_ cBB _] := and3P abelB. -have{abelB oB} ncycB: ~~ cyclic B by rewrite (abelem_cyclic abelB) (eqP oB). -have [R0 sylR0] := Sylow_exists q 'C(A); have [cAR0 qR0 _] := and3P sylR0. -have nR0A: A \subset 'N(R0) by rewrite cents_norm // centsC. -have{nR0A} [R maxR sR0R] := max_normed_exists qR0 nR0A. -apply/imsetP; exists R => //; apply/setP=> Q. -apply/idP/imsetP=> [maxQ|[k Kk] ->]; last by rewrite actsKmax. -have [qR nRA]:= mem_max_normed maxR; have [qQ nQA]:= mem_max_normed maxQ. -have [R1 | ntR] := eqVneq R 1%G. - rewrite trivg_max_norm -R1 // in maxQ. - by exists 1; rewrite ?group1 ?act1 ?(set1P maxQ). -have ntQ: Q != 1%G. - by apply: contra ntR => Q1; rewrite trivg_max_norm -(eqP Q1) // inE in maxR *. -have ntRC: 'C_R(A) != 1. - have sR0CR: R0 \subset 'C_R(A) by rewrite subsetI sR0R. - suffices: R0 :!=: 1 by apply: subG1_contra. - move: ntR; rewrite -!cardG_gt1 -(part_pnat_id qR) (card_Hall sylR0). - by rewrite !p_part_gt1 !mem_primes !cardG_gt0 qC => /and3P[->]. -have: [exists (z | 'C_Q[z] != 1), z \in B^#]. - apply: contraR ntQ => trQ; have:= subset_trans sBA nQA. - rewrite -[_ == _]subG1=> /coprime_abelian_gen_cent1 <- //; last first. - by rewrite coprime_sym (coprimeSg sBA) ?coprime_pi' /pgroup ?(pi_pnat qQ). - rewrite gen_subG; apply/bigcupsP=> z Cz; rewrite subG1. - by apply: contraR trQ => ntCz; apply/existsP; exists z; rewrite ntCz. -case/existsP=> z; rewrite 2!inE => /and3P[ntzQ ntz Bz]. -have prCz: 'C[z] \proper G by rewrite -cent_cycle mFT_cent_proper ?cycle_eq1. -have sACz: A \subset 'C[z] by rewrite sub_cent1 (subsetP cAB). -have [|//|k Kk defQ2]:= normed_constrained_meet_trans sACz prCz maxR maxQ. - apply: subG1_contra ntRC; rewrite setIS //=. - by rewrite -cent_cycle centS // cycle_subG (subsetP sBA). -by exists k => //; apply: val_inj. -Qed. - -(* This is B & G, Theorem 7.4. *) -Theorem normed_trans_superset P : - A <|<| P -> pi.-group P -> [transitive K, on |/|*(A; q) | 'JG] -> - [/\ 'C_K(P) = 'O_pi^'('C(P)), - [transitive 'O_pi^'('C(P)), on |/|*(P; q) | 'JG], - |/|*(P; q) \subset |/|*(A; q) - & {in |/|*(P; q), forall Q, P :&: 'N(P)^`(1) \subset 'N(Q)^`(1) - /\ 'N(P) = 'C_K(P) * 'N_('N(P))(Q)}]. -Proof. -move=> snAP piP trnK; set KP := 'O_pi^'('C(P)). -have defK B: A \subset B -> 'C_K(B) = 'O_pi^'('C(B)). - move=> sAB; apply/eqP; rewrite eqEsubset {1}setIC pcoreS ?centS // subsetI. - by rewrite gFsub (sub_Hall_pcore hallK) ?pcore_pgroup // gFsub_trans ?centS. -suffices: [transitive KP, on |/|*(P; q) | 'JG] /\ |/|*(P; q) \subset |/|*(A; q). - have nsKPN: KP <| 'N(P) := gFnormal_trans _ (cent_normal _). - case=> trKP smnPA; rewrite (defK _ (subnormal_sub snAP)); split=> // Q maxQ. - have defNP: KP * 'N_('N(P))(Q) = 'N(P). - rewrite -(astab1JG Q) -normC; last by rewrite subIset 1?normal_norm. - apply/(subgroup_transitiveP maxQ); rewrite ?normal_sub //=. - by rewrite (atrans_supgroup _ trKP) ?norm_acts_max_norm ?normal_sub. - split=> //; move/pprod_focal_coprime: defNP => -> //. - - by rewrite subIset // orbC commgSS ?subsetIr. - - by rewrite subsetI normG; case/mem_max_normed: maxQ. - by rewrite (p'nat_coprime (pcore_pgroup _ _)). -elim: {P}_.+1 {-2}P (ltnSn #|P|) => // m IHm P lePm in KP piP snAP *. -wlog{snAP} [B maxnB snAB]: / {B : grT | maxnormal B P P & A <|<| B}. - case/subnormalEr: snAP => [|[D [snAD nDP prDP]]]; first by rewrite /KP => <-. - have [B maxnB sDB]: {B : grT | maxnormal B P P & D \subset B}. - by apply: maxgroup_exists; rewrite prDP normal_norm. - apply; exists B => //; apply: subnormal_trans snAD (normal_subnormal _). - by apply: normalS sDB _ nDP; case/andP: (maxgroupp maxnB); case/andP. -have [prBP nBP] := andP (maxgroupp maxnB); have sBP := proper_sub prBP. -have{lePm}: #|B| < m by apply: leq_trans (proper_card prBP) _. -case/IHm=> {IHm}// [|trnB smnBA]; first by rewrite (pgroupS sBP). -have{maxnB} abelPB: is_abelem (P / B). - apply: charsimple_solvable (maxnormal_charsimple _ maxnB) _ => //. - have [_ ntA _ _] := cstrA; have sAB := subnormal_sub snAB. - by apply: mFT_quo_sol; apply: contraL sAB; move/eqP->; rewrite subG1. -have{abelPB} [p p_pr pPB]: exists2 p, prime p & p.-group (P / B). - by case/is_abelemP: abelPB => p p_pr; case/andP; exists p. -have{prBP} pi_p: p \in pi. - case/pgroup_pdiv: pPB => [|_ pPB _]. - by rewrite -subG1 quotient_sub1 // proper_subn. - by apply: pgroupP p_pr pPB; apply: quotient_pgroup. -pose S := |/|*(B; q); have p'S: #|S| %% p != 0. - have pi'S: pi^'.-nat #|S| := pnat_dvd (atrans_dvd trnB) (pcore_pgroup _ _). - by rewrite -prime_coprime // (pnat_coprime _ pi'S) ?pnatE. -have{p'S} [Q S_Q nQP]: exists2 Q, Q \in S & P \subset 'N(Q). - have sTSB: setT \subset G / B by rewrite -im_quotient quotientS ?subsetT. - have modBE: {in P & S, forall x Q, ('JG %% B) Q (coset B x) = 'JG Q x}%act. - move=> x Q Px; rewrite inE; move/maxgroupp; case/andP=> _ nQB. - by rewrite /= modactE ?(subsetP nBP) ?afixJG ?setTI ?inE. - have actsPB: [acts P / B, on S | 'JG %% B \ sTSB]. - apply/subsetP=> _ /morphimP[x Nx Px ->]. - rewrite !inE; apply/subsetP=> Q S_Q; rewrite inE /= modBE //. - by rewrite (actsP (norm_acts_max_norm q B)). - move: p'S; rewrite (pgroup_fix_mod pPB actsPB); set nQ := #|_|. - case: (posnP nQ) => [->|]; first by rewrite mod0n. - rewrite lt0n; case/existsP=> Q /setIP[Q_S fixQ]; exists Q => //. - apply/normsP=> x Px; apply: congr_group; have Nx := subsetP nBP x Px. - by have:= afixP fixQ (coset B x); rewrite /= modBE ?mem_morphim //= => ->. -have [qQ _]:= mem_max_normed S_Q. -have{qQ nQP} [Q0 maxQ0 sQQ0] := max_normed_exists qQ nQP. -have [_ nQ0P]:= mem_max_normed maxQ0. -have actsKmnP: [acts 'O_pi^'('C(P)), on |/|*(P; q) | 'JG]. - by rewrite (subset_trans _ (norm_acts_max_norm q P)) // cents_norm ?pcore_sub. -case nt_mnP: (1%G \in |/|*(P; q)) => [|{Q S_Q sQQ0}]. - rewrite atrans_acts_card actsKmnP trivg_max_norm // imset_set1 in maxQ0 *. - have <-: Q = 1%G by apply/trivGP; rewrite -(congr_group (set1P maxQ0)). - by rewrite cards1 sub1set (subsetP smnBA). -have sAB := subnormal_sub snAB; have sAP := subset_trans sAB sBP. -have smnP_S: |/|*(P; q) \subset S. - apply/subsetP=> Q1 maxQ1; have [qQ1 nQ1P] := mem_max_normed maxQ1. - have ntQ1: Q1 != 1%G by case: eqP nt_mnP maxQ1 => // -> ->. - have prNQ1: 'N(Q1) \proper G := mFT_norm_proper ntQ1 (mFT_pgroup_proper qQ1). - have nQ1A: A \subset 'N(Q1) := subset_trans sAP nQ1P. - have [Q2 maxQ2 sQ12] := max_normed_exists qQ1 (subset_trans sBP nQ1P). - have [qQ2 nQ2B] := mem_max_normed maxQ2; apply: etrans maxQ2; congr in_mem. - apply: val_inj; suffices: q.-Sylow(Q2) Q1 by move/pHall_id=> /= ->. - have qNQ2: q.-group 'N_Q2(Q1) by rewrite (pgroupS _ qQ2) ?subsetIl. - pose KN := 'O_pi^'('N(Q1)); have sNQ2_KN: 'N_Q2(Q1) \subset KN. - rewrite hyp71 // inE normsI ?norms_norm ?(subset_trans sAB nQ2B) //=. - by rewrite /psubgroup subsetIr andbT; apply: pi_pnat qNQ2 _. - rewrite -Sylow_subnorm (pHall_subl _ sNQ2_KN) ?subsetI ?sQ12 ?normG //= -/KN. - suff: exists Q3 : grT, [/\ q.-Sylow(KN) Q3, P \subset 'N(Q3) & Q1 \subset Q3]. - move: maxQ1; rewrite inE; case/maxgroupP=> _ maxQ1 [Q3 [sylQ3 nQ3P sQ13]]. - by rewrite -(maxQ1 Q3) // (pHall_pgroup sylQ3). - apply: coprime_Hall_subset; rewrite //= -/KN. - - by rewrite gFnorm_trans ?norms_norm. - - by rewrite coprime_sym (pnat_coprime piP (pcore_pgroup _ _)). - - by rewrite (solvableS (pcore_sub _ _)) ?mFT_sol. - by rewrite pcore_max ?normalG // /pgroup (pi_pnat qQ1). -split; last exact: subset_trans smnP_S smnBA. -apply/imsetP; exists Q0 => //; apply/setP=> Q2. -apply/idP/imsetP=> [maxQ2 | [k Pk ->]]; last by rewrite (actsP actsKmnP). -have [S_Q0 S_Q2]: Q0 \in S /\ Q2 \in S by rewrite !(subsetP smnP_S). -pose KB := 'O_pi^'('C(B)); pose KBP := KB <*> P. -have pi'KB: pi^'.-group KB by apply: pcore_pgroup. -have nKB_P: P \subset 'N(KB) by rewrite gFnorm_trans ?norms_cent. -have [k KBk defQ2]:= atransP2 trnB S_Q0 S_Q2. -have [qQ2 nQ2P] := mem_max_normed maxQ2. -have hallP: pi.-Hall('N_KBP(Q2)) P. - have sPN: P \subset 'N_KBP(Q2) by rewrite subsetI joing_subr. - rewrite pHallE eqn_leq -{1}(part_pnat_id piP) dvdn_leq ?partn_dvd ?cardSg //. - have ->: #|P| = #|KBP|`_pi. - rewrite /KBP joingC norm_joinEl // coprime_cardMg ?(pnat_coprime piP) //. - by rewrite partnM // part_pnat_id // part_p'nat // muln1. - by rewrite sPN dvdn_leq ?partn_dvd ?cardSg ?cardG_gt0 ?subsetIl. -have hallPk: pi.-Hall('N_KBP(Q2)) (P :^ k). - rewrite pHallE -(card_Hall hallP) cardJg eqxx andbT subsetI /=. - by rewrite defQ2 normJ conjSg conj_subG ?joing_subr // mem_gen // inE KBk. -have [gz]: exists2 gz, gz \in 'N_KBP(Q2) & P :=: (P :^ k) :^ gz. - apply: Hall_trans (solvableS (subsetIr _ _) _) hallP hallPk. - have ntQ2: Q2 != 1%G by case: eqP nt_mnP maxQ2 => // -> ->. - exact: mFT_sol (mFT_norm_proper ntQ2 (mFT_pgroup_proper qQ2)). -rewrite [KBP]norm_joinEr //= setIC -group_modr //= setIC -/KB. -case/imset2P=> g z; case/setIP=> KBg nQ2g Pz ->{gz} defP. -exists (k * g); last first. - by apply: val_inj; rewrite /= conjsgM -(normP nQ2g) defQ2. -rewrite /KP -defK // (subsetP (subsetIl _ 'C(B))) //= setIAC defK // -/KB. -rewrite -coprime_norm_cent 1?coprime_sym ?(pnat_coprime piP) //= -/KB. -rewrite inE groupM //; apply/normP. -by rewrite -{2}(conjsgK z P) (conjGid Pz) {2}defP /= !conjsgM conjsgK. -Qed. - -End NormedConstrained. - -(* This is B & G, Proposition 7.5(a). As this is only used in Proposition *) -(* 10.10, under the assumption A \in E*_p(G), we avoid the in_pmaxElemE *) -(* detour A = [set x in 'C_G(A) | x ^+ p == 1], and just use A \in E*_p(G). *) -Proposition plength_1_normed_constrained p A : - A :!=: 1 -> A \in 'E*_p(G) -> (forall M, M \proper G -> p.-length_1 M) -> - normed_constrained A. -Proof. -move=> ntA EpA pl1subG. -case/pmaxElemP: (EpA); case/pElemP=> sAG; case/and3P=> pA cAA _ _. -have prA: A \proper G := sub_proper_trans cAA (mFT_cent_proper ntA). -split=> // X Y sAX prX; case/setIdP; case/andP=> sYX p'Y nYA. -have pl1X := pl1subG _ prX; have solX := mFT_sol prX. -have [p_pr _ [r oApr]] := pgroup_pdiv pA ntA. -have oddp: odd p by move: (mFT_odd A); rewrite oApr odd_exp. -have def_pi: \pi(A)^' =i p^'. - by move=> q; rewrite inE /= oApr pi_of_exp // pi_of_prime. -have{p'Y} p'Y : p^'.-group Y by rewrite -(eq_pgroup _ def_pi). -rewrite (eq_pcore _ def_pi) (@plength1_norm_pmaxElem _ p X A) //. -by rewrite (subsetP (pmaxElemS p (subsetT _))) // setIC 2!inE sAX. -Qed. - -(* This is B & G, Proposition 7.5(b). *) -Proposition SCN_normed_constrained p P A : - p.-Sylow(G) P -> A \in 'SCN_2(P) -> normed_constrained A. -Proof. -move=> sylP; rewrite 2!inE -andbA => /and3P[nsAP /eqP defCA lt1mA]. -have [sAP nAP]:= andP nsAP. -have pP := pHall_pgroup sylP; have pA := pgroupS sAP pP. -have abA: abelian A by rewrite /abelian -{1}defCA subsetIr. -have prP: P \proper G := mFT_pgroup_proper pP. -have ntA: A :!=: 1 by rewrite -rank_gt0 ltnW. -pose pi := \pi(A); simpl in pi. -have [p_pr pdvA [r oApr]] := pgroup_pdiv pA ntA. -have{r oApr} def_pi: pi =i (p : nat_pred). - by move=> p'; rewrite !inE oApr primes_exp // primes_prime ?inE. -have def_pi' := eq_negn def_pi; have defK := eq_pcore _ def_pi'. -pose Z := 'Ohm_1('Z(P)); have sZ_ZP: Z \subset 'Z(P) by apply: Ohm_sub. -have sZP_A: 'Z(P) \subset A by rewrite -defCA setIS ?centS. -have sZA := subset_trans sZ_ZP sZP_A. -have nsA1: 'Ohm_1(A) <| P by apply: gFnormal_trans. -pose inZor1 B := B \subset Z \/ #|Z| = p /\ Z \subset B. -have [B [E2_B nsBP sBZ]]: exists B, [/\ B \in 'E_p^2(A), B <| P & inZor1 B]. - have pZP: p.-group 'Z(P) by apply: pgroupS (center_sub _) pP. - have pZ: p.-group Z by apply: pgroupS sZ_ZP pZP. - have abelZ: p.-abelem Z by rewrite Ohm1_abelem ?center_abelian. - have nsZP: Z <| P := sub_center_normal sZ_ZP; have [sZP nZP] := andP nsZP. - case: (eqVneq Z 1). - rewrite -(setIidPr sZ_ZP); move/TI_Ohm1; rewrite setIid. - by move/(trivg_center_pgroup pP)=> P1; rewrite -subG1 -P1 sAP in ntA. - case/(pgroup_pdiv pZ)=> _ _ [[|k] /=]; rewrite -/Z => oZ; last first. - have: 2 <= 'r_p(Z) by rewrite p_rank_abelem // oZ pfactorK. - case/p_rank_geP=> B; rewrite /= -/Z => Ep2Z_B; exists B. - rewrite (subsetP (pnElemS _ _ sZA)) //. - case/setIdP: Ep2Z_B; case/setIdP=> sBZ _ _; split=> //; last by left. - by rewrite sub_center_normal ?(subset_trans sBZ). - pose BZ := ('Ohm_1(A) / Z) :&: 'Z(P / Z). - have ntBz: BZ != 1. - rewrite meet_center_nil ?quotient_nil ?(pgroup_nil pP) ?quotient_normal //. - rewrite -subG1 quotient_sub1 ?(subset_trans (normal_sub nsA1) nZP) //= -/Z. - apply: contraL lt1mA => sA1Z; rewrite -(pfactorK 1 p_pr) -oZ -rank_Ohm1. - by rewrite -(rank_abelem abelZ) -leqNgt rankS. - have lt1A1: 1 < logn p #|'Ohm_1(A)| by rewrite -p_rank_abelian -?rank_pgroup. - have [B [sBA1 nsBP oB]] := normal_pgroup pP nsA1 lt1A1. - exists B; split=> //; last do [right; split=> //]. - rewrite 2!inE (subset_trans sBA1) ?Ohm_sub // oB pfactorK //. - by rewrite (abelemS sBA1) ?Ohm1_abelem. - apply/idPn=> s'BZ; have: B :&: Z = 1 by rewrite setIC prime_TIg ?oZ. - move/TI_Ohm1; apply/eqP; rewrite meet_center_nil ?(pgroup_nil pP) //. - by rewrite -cardG_gt1 oB (ltn_exp2l 0 _ (prime_gt1 p_pr)). -split; rewrite ?(sub_proper_trans sAP) // => X Y sAX prX. -rewrite inE defK -andbA (eq_pgroup _ def_pi'); case/and3P=> sYX p'Y nYA. -move: E2_B; rewrite 2!inE -andbA; case/and3P=> sBA abelB dimB2. -have [pB cBB _] := and3P abelB. -have ntB: B :!=: 1 by case: (eqsVneq B 1) dimB2 => // ->; rewrite cards1 logn1. -have cBA b: b \in B -> A \subset 'C[b]. - by move=> Bb; rewrite -cent_set1 centsC sub1set (subsetP abA) ?(subsetP sBA). -have solCB (b : gT): b != 1 -> solvable 'C[b]. - by move=> ntb; rewrite mFT_sol ?mFT_cent1_proper. -wlog{sAX prX} [b B'b defX]: X Y p'Y nYA sYX / exists2 b, b \in B^# & 'C[b] = X. - move=> IH; have nYB := subset_trans sBA nYA. - rewrite -(coprime_abelian_gen_cent1 cBB _ nYB); last first. - - by rewrite coprime_sym (pnat_coprime pB). - - apply: contraL dimB2 => /cyclicP[x defB]. - have Bx: x \in B by rewrite defB cycle_id. - rewrite defB -orderE (abelem_order_p abelB Bx) ?(pfactorK 1) //. - by rewrite -cycle_eq1 -defB. - rewrite gen_subG; apply/bigcupsP=> b B'b. - have [ntb Bb]:= setD1P B'b; have sYbY: 'C_Y[b] \subset Y := subsetIl _ _. - have{IH} sYbKb: 'C_Y[b] \subset 'O_p^'('C[b]). - rewrite IH ?(pgroupS sYbY) ?subsetIr //; last by exists b. - by rewrite normsI // ?normsG ?cBA. - have{sYbKb} sYbKXb: 'C_Y[b] \subset 'O_p^'('C_X(<[b]>)). - apply: subset_trans (pcoreS _ (subsetIr _ _)). - by rewrite /= cent_gen cent_set1 subsetI setSI. - rewrite (subset_trans sYbKXb) // p'core_cent_pgroup ?mFT_sol //. - rewrite /psubgroup ?(pgroupS _ pB) cycle_subG //. - by rewrite (subsetP sAX) ?(subsetP sBA). -wlog Zb: b X Y defX B'b p'Y nYA sYX / b \in Z. - move=> IH; case Zb: (b \in Z); first exact: IH Zb. - case/setD1P: B'b => ntb Bb; have solX := solCB b ntb; rewrite defX in solX. - case: sBZ => [sBZ | [oZ sZB]]; first by rewrite (subsetP sBZ) in Zb. - have defB: Z * <[b]> = B. - apply/eqP; rewrite eqEcard mulG_subG sZB cycle_subG Bb. - have obp := abelem_order_p abelB Bb ntb. - rewrite (card_pgroup pB) /= (eqP dimB2) TI_cardMg -/#[_] ?oZ ?obp //. - rewrite -obp in p_pr; case: (prime_subgroupVti [group of Z] p_pr) => //. - by rewrite cycle_subG Zb. - pose P1 := P :&: X; have sP1P: P1 \subset P := subsetIl _ _. - have pP1 := pgroupS sP1P pP. - have [P2 sylP2 sP12] := Sylow_superset (subsetIr _ _) pP1. - have defP1: P1 = 'C_P(B). - rewrite -defB centM /= -/Z setIA /cycle cent_gen cent_set1 defX. - by rewrite [P :&: _](setIidPl _) // centsC (subset_trans sZ_ZP) ?subsetIr. - have dimPP1: logn p #|P : P1| <= 1. - by rewrite defP1 logn_quotient_cent_abelem ?normal_norm ?(eqP dimB2). - have{dimPP1} nsP12: P1 <| P2. - have pP2 := pHall_pgroup sylP2. - have: logn p #|P2 : P1| <= 1. - apply: leq_trans dimPP1; rewrite dvdn_leq_log //. - rewrite -(dvdn_pmul2l (cardG_gt0 [group of P1])) !Lagrange ?subsetIl //. - rewrite -(part_pnat_id pP2) (card_Hall sylP). - by rewrite partn_dvd ?cardSg ?subsetT. - rewrite -(pfactorK 1 p_pr) -pfactor_dvdn ?prime_gt0 // -p_part. - rewrite part_pnat_id ?(pnat_dvd (dvdn_indexg _ _)) //=. - case: (primeP p_pr) => _ dv_p; move/dv_p=> {dv_p}. - case/pred2P=> oP21; first by rewrite -(index1g sP12 oP21) normal_refl. - by rewrite (p_maximal_normal pP2) ?p_index_maximal ?oP21. - have nsZP1_2: 'Z(P1) <| P2 by rewrite gFnormal_trans. - have sZKp: Z \subset 'O_{p^', p}(X). - suff: 'Z(P1) \subset 'O_{p^', p}(X). - apply: subset_trans; rewrite subsetI {1}defP1 (subset_trans sZB). - by rewrite (subset_trans sZ_ZP) ?subIset // orbC centS. - by rewrite subsetI normal_sub. - apply: odd_p_abelian_constrained sylP2 (center_abelian _) nsZP1_2 => //. - exact: mFT_odd. - have coYZ: coprime #|Y| #|Z|. - by rewrite oZ coprime_sym (pnat_coprime _ p'Y) ?pnatE ?inE. - have nYZ := subset_trans sZA nYA. - have <-: [~: Y, Z] * 'C_Y(Z) = Y. - exact: coprime_cent_prod (solvableS sYX solX). - set K := 'O_p^'(X); have [nKY nKZ]: Y \subset 'N(K) /\ Z \subset 'N(K). - by rewrite !gFnorm_trans ?(subset_trans sZA) ?normsG // -defX cBA. - rewrite mul_subG //. - have coYZK: coprime #|Y / K| #|'O_p(X / K)|. - by rewrite coprime_sym coprime_morphr ?(pnat_coprime (pcore_pgroup _ _)). - rewrite -quotient_sub1 ?comm_subG // -(coprime_TIg coYZK) subsetI. - rewrite /= -quotient_pseries2 !quotientS ?commg_subl //. - by rewrite (subset_trans (commgSS sYX sZKp)) ?commg_subr //= gFnorm. - have: 'O_p^'('C_X(Z)) \subset K. - rewrite p'core_cent_pgroup // /psubgroup /pgroup oZ pnat_id //. - by rewrite -defX (subset_trans sZA) ?cBA. - apply: subset_trans; apply: subset_trans (pcoreS _ (subsetIr _ _)). - have: cyclic Z by rewrite prime_cyclic ?oZ. - case/cyclicP=> z defZ; have Zz: z \in Z by rewrite defZ cycle_id. - rewrite subsetI setSI //= (IH z) ?subsetIr ?(pgroupS (subsetIl _ _)) //. - - by rewrite defZ /= cent_gen cent_set1. - - rewrite !inE -cycle_eq1 -defZ trivg_card_le1 oZ -ltnNge prime_gt1 //=. - by rewrite (subsetP sZB). - by rewrite normsI // norms_cent // cents_norm // centsC (subset_trans sZA). -set K := 'O_p^'(X); have nsKX: K <| X by apply: pcore_normal. -case/setD1P: B'b => ntb Bb. -have [sAX solX]: A \subset X /\ solvable X by rewrite -defX cBA ?solCB. -have sPX: P \subset X. - by rewrite -defX -cent_set1 centsC sub1set; case/setIP: (subsetP sZ_ZP b Zb). -have [nKA nKY nKP]: [/\ A \subset 'N(K), Y \subset 'N(K) & P \subset 'N(K)]. - by rewrite !(subset_trans _ (normal_norm nsKX)). -have sylPX: p.-Sylow(X) P by apply: pHall_subl (subsetT _) sylP. -have sAKb: A \subset 'O_{p^', p}(X). - exact: (odd_p_abelian_constrained (mFT_odd _)) abA nsAP. -have coYZK: coprime #|Y / K| #|'O_p(X / K)|. - by rewrite coprime_sym coprime_morphr ?(pnat_coprime (pcore_pgroup _ _)). -have cYAq: A / K \subset 'C_('O_p(X / K))(Y / K). - rewrite subsetI -quotient_pseries2 quotientS //= (sameP commG1P trivgP). - rewrite /= -quotientR // -(coprime_TIg coYZK) subsetI /= -quotient_pseries2. - rewrite !quotientS ?commg_subr // (subset_trans (commgSS sAKb sYX)) //. - by rewrite commg_subl /= gFnorm. -have cYKq: Y / K \subset 'C('O_p(X / K)). - apply: coprime_nil_faithful_cent_stab => /=. - - by rewrite gFnorm_trans ?normsG ?quotientS. - - by rewrite coprime_sym. - - exact: pgroup_nil (pcore_pgroup _ _). - apply: subset_trans (cYAq); rewrite -defCA -['C_P(A) / K](morphim_restrm nKP). - rewrite injm_cent ?ker_restrm ?ker_coset ?morphim_restrm -?quotientE //. - rewrite setIid (setIidPr sAP) setISS ?centS //. - by rewrite pcore_sub_Hall ?morphim_pHall. - by rewrite coprime_TIg ?(pnat_coprime _ (pcore_pgroup _ _)). -rewrite -quotient_sub1 //= -/K -(coprime_TIg coYZK) subsetI subxx /=. -rewrite -Fitting_eq_pcore ?trivg_pcore_quotient // in cYKq *. -apply: subset_trans (cent_sub_Fitting (quotient_sol _ solX)). -by rewrite subsetI quotientS. -Qed. - -(* This is B & G, Theorem 7.6 (the Thompson Transitivity Theorem). *) -Theorem Thompson_transitivity p q A : - A \in 'SCN_3[p] -> q \in p^' -> - [transitive 'O_p^'('C(A)), on |/|*(A; q) | 'JG]. -Proof. -case/bigcupP=> P; rewrite 2!inE => sylP /andP[SCN_A mA3]. -have [defZ def_pi']: 'Z(A) = A /\ \pi(A)^' =i p^'. - rewrite inE -andbA in SCN_A; case/and3P: SCN_A => sAP _ /eqP defCA. - case: (eqsVneq A 1) mA3 => /= [-> | ntA _]. - rewrite /rank big1_seq // => p1 _; rewrite /p_rank big1 // => E. - by rewrite inE; case/andP; move/trivgP->; rewrite cards1 logn1. - have [p_pr _ [k ->]] := pgroup_pdiv (pgroupS sAP (pHall_pgroup sylP)) ntA. - split=> [|p1]; last by rewrite !inE primes_exp // primes_prime ?inE. - by apply/eqP; rewrite eqEsubset subsetIl subsetI subxx -{1}defCA subsetIr. -rewrite -(eq_pcore _ def_pi') -def_pi' => pi'q. -apply: normed_constrained_rank3_trans; rewrite ?defZ //. -by apply: SCN_normed_constrained sylP _; rewrite inE SCN_A ltnW. -Qed. - -End Seven. - |
