1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
|
(* (c) Copyright 2006-2015 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.
Implicit 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.
Implicit 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.
|