Skip to content

Commit e5b4036

Browse files
author
Quentin VERMANDE
committed
comments
1 parent 959f75d commit e5b4036

2 files changed

Lines changed: 52 additions & 59 deletions

File tree

theories/xmathcomp/artin_scheier.v

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,15 @@ Let p1 : (1 < p)%N.
2626
Proof. by apply prime_gt1. Qed.
2727

2828
Lemma ArtinScheier_factorize :
29-
'X^p - 'X - (x ^+ p - x)%:P =
30-
\prod_(z <- [seq x + (val i)%:R | i <- (index_enum (ordinal_finType p))])
31-
('X - z%:P).
29+
'X^p - 'X - (x ^+ p - x)%:P = \prod_(i < p) ('X - (x + i%:R)%:P).
3230
Proof.
3331
case: p pchar pprim p0 p1 => // n nchar nprim n0 n1.
3432
apply/eqP; rewrite -eqp_monic; first last.
3533
- by apply monic_prod_XsubC.
3634
- apply/monicP; rewrite -addrA -opprD lead_coefDl ?lead_coefXn//.
3735
by rewrite size_opp size_XaddC size_polyXn ltnS.
3836
- rewrite eqp_sym -dvdp_size_eqp.
39-
rewrite big_map size_prod; last first.
37+
rewrite size_prod; last first.
4038
move=> [i]/= _ _; apply/negP => /eqP
4139
/(congr1 (fun p : {poly L} => size p)).
4240
by rewrite size_XsubC size_polyC eqxx.
@@ -47,13 +45,14 @@ apply/eqP; rewrite -eqp_monic; first last.
4745
rewrite -add1n mul2n -addnn addnA card_ord -addnBA// subnn addn0 add1n.
4846
rewrite -addrA -opprD size_addl size_polyXn// size_opp size_XaddC ltnS.
4947
by move: pchar => /andP [ /prime_gt1 ].
50-
apply uniq_roots_dvdp.
48+
have: all (root ('X^n.+1 - 'X - (x ^+ n.+1 - x)%:P)) [seq (x + (val i)%:R) | i <- index_enum (ordinal_finType n.+1)].
5149
apply/allP => + /mapP [i _ ->] => _.
5250
rewrite/root !hornerE ?hornerXn -(Frobenius_autE nchar (x + (val i)%:R)).
5351
(* FIXME: remove ?hornerXn when requiring MC >= 1.16.0 *)
5452
rewrite rmorphD/= rmorph_nat (Frobenius_autE nchar x).
55-
rewrite opprD opprB addrACA -addrA 2![x+_]addrA subrr add0r.
53+
rewrite opprB opprD addrACA -addrA 2![x+_]addrA subrr add0r.
5654
by rewrite addrAC addrCA subrr addr0 addrC subrr.
55+
move=>/uniq_roots_dvdp; rewrite big_map; apply.
5756
rewrite uniq_rootsE; apply/(uniqP 0) => i j.
5857
rewrite 2!inE size_map => ilt jlt.
5958
rewrite (nth_map ord0)// (nth_map ord0)// => /addrI/esym/eqP.
@@ -117,25 +116,26 @@ Lemma minPoly_ArtinSchreier : (x \notin E) ->
117116
minPoly E x = 'X^p - 'X - (x ^+ p - x)%:P.
118117
Proof.
119118
move=> xE.
119+
have pE: ('X^p - 'X - (x ^+ p - x)%:P) = \prod_(i <- [seq x + (val i)%:R | i : 'I_p]) ('X - i%:P).
120+
by rewrite ArtinScheier_factorize big_map; apply congr_big => //; rewrite enumT.
120121
have /(minPoly_dvdp ArtinSchreier_polyOver): root ('X^p - 'X - (x ^+ p - x)%:P) x.
121-
rewrite ArtinScheier_factorize root_prod_XsubC.
122+
rewrite pE root_prod_XsubC.
122123
case: p pchar pprim p0 p1 => // n nchar nprim n0 n1.
123-
apply/mapP; exists ord0; first by rewrite mem_index_enum.
124+
apply/mapP; exists ord0; first by rewrite enumT mem_index_enum.
124125
by rewrite addr0.
125-
rewrite ArtinScheier_factorize big_map.
126-
move=> /dvdp_prod_XsubC[m]; rewrite eqp_monic ?monic_minPoly//; last first.
126+
rewrite pE => /dvdp_prod_XsubC[m]; rewrite eqp_monic ?monic_minPoly//; last first.
127127
by rewrite monic_prod// => i _; rewrite monic_XsubC.
128-
have [{}m sm ->] := resize_mask m (index_enum (ordinal_finType p)).
128+
rewrite -map_mask.
129+
have [{}m sm ->] := resize_mask m (enum 'I_p).
129130
set s := mask _ _ => /eqP mEx.
130131
have [|smp_gt0] := posnP (size s).
131132
case: s mEx => // /(congr1 (horner^~x))/esym/eqP.
132133
by rewrite minPolyxx big_nil hornerC oner_eq0.
133134
suff leq_pm : (p <= size s)%N.
134-
move: mEx; suff /eqP->: s == index_enum (ordinal_finType p) by [].
135+
move: mEx; suff /eqP->: s == enum 'I_p by [].
135136
rewrite -(geq_leqif (size_subseq_leqif _)) ?mask_subseq//.
136-
by rewrite/index_enum; case: index_enum_key=>/=; rewrite -enumT size_enum_ord.
137+
by rewrite/index_enum; case: index_enum_key=>/=; rewrite size_enum_ord.
137138
have /polyOverP/(_ (size s).-1%N) := minPolyOver E x; rewrite {}mEx.
138-
have ->: \prod_(i <- s) ('X - (x + (val i)%:R)%:P) = \prod_(i <- [seq x + (val i)%:R | i <- s]) ('X - i%:P) by rewrite big_map.
139139
rewrite -(size_map (fun i => x + (val i)%:R)) coefPn_prod_XsubC size_map -?lt0n// big_map.
140140
rewrite memvN big_split/= big_const_seq count_predT iter_addr_0 => DE.
141141
have sE: \sum_(i <- s) i%:R \in E by apply rpred_sum => i _; apply rpred_nat.

theories/xmathcomp/temp.v

Lines changed: 38 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,6 @@ Local Open Scope ring_scope.
1313

1414
Section Temp.
1515

16-
Lemma ord_S_split n (i: 'I_n.+1): {j: 'I_n | i = lift ord0 j} + {i = ord0}.
17-
Proof.
18-
case: i; case=>[| i] ilt.
19-
by right; apply val_inj.
20-
by left; exists (Ordinal (ltnSE ilt)); apply val_inj.
21-
Qed.
22-
2316
(* NB : rpredM and mulrPred uses that 1 is in the subset, which is useless. Predicates should be defined for {aspace aT}. *)
2417

2518
Lemma memv_mulr_2closed [K : fieldType] [aT : FalgType K] (U : {aspace aT}) : GRing.mulr_2closed U.
@@ -41,22 +34,23 @@ Lemma ahom_eq_adjoin [F0 : fieldType] [K : fieldExtType F0] [rT : FalgType F0] (
4134
(U : {subfield K}) (x : K) :
4235
{in U, f =1 g} -> f x = g x -> {in <<U; x>>%VS, f =1 g}.
4336
Proof.
44-
move=>fgU fgx y /Fadjoin_poly_eq <-.
45-
move:(Fadjoin_polyOver U x y); generalize (Fadjoin_poly U x y) => p /polyOverP pU.
37+
move=> fgU fgx y /Fadjoin_poly_eq <-.
38+
move: (Fadjoin_poly U x y) (Fadjoin_polyOver U x y) => p /polyOverP pU.
4639
rewrite -(coefK p) horner_poly 2!rmorph_sum/=; apply eq_bigr => i _.
4740
by rewrite 2!rmorphM /= fgU// 2!rmorphX/= fgx.
4841
Qed.
4942

5043
Lemma ahom_eq_adjoin_seq [F0 : fieldType] [K : fieldExtType F0] [rT : FalgType F0] (f g : 'AHom(K, rT))
5144
(U : {aspace K}) (xs : seq K) :
52-
{in U, f =1 g} -> all (fun x => f x == g x) xs -> {in <<U & xs>>%VS, f =1 g}.
45+
{in U, f =1 g} -> {in xs, forall x, f x = g x} -> {in <<U & xs>>%VS, f =1 g}.
5346
Proof.
5447
elim: xs U => [|x xs IHxs] U fgU fgxs.
5548
by rewrite adjoin_nil subfield_closed.
5649
rewrite adjoin_cons.
5750
have ->: <<U; x>>%VS = ASpace (agenv_is_aspace <<U; x>>%VS) by rewrite /= agenv_id.
58-
move: fgxs (IHxs (ASpace (agenv_is_aspace <<U; x>>))) => /andP[/eqP fgx fgxs] /=.
59-
by rewrite agenv_id => /(_ (ahom_eq_adjoin fgU fgx) fgxs).
51+
move: fgxs (IHxs (ASpace (agenv_is_aspace <<U; x>>))) => fgxs /=.
52+
rewrite agenv_id; apply; first by apply/ahom_eq_adjoin/fgxs=>//; apply mem_head.
53+
by move=>a axs; apply fgxs; rewrite in_cons axs orbT.
6054
Qed.
6155

6256
Lemma agenv_span (K : fieldType) (L : fieldExtType K) (U : {subfield L}) (X : seq L) : <<X>>%VS = U -> <<1%VS & X>>%VS = U.
@@ -67,13 +61,13 @@ rewrite -{2}(subfield_closed U) (agenvEr U) subfield_closed.
6761
by congr (1 + _)%VS; apply/esym/field_module_eq; rewrite sup_field_module.
6862
Qed.
6963

70-
Lemma gal_ne (F0 : fieldType) (L : splittingFieldType F0) (E : {subfield L}) (f g : FinGroup.finType (gal_finGroupType E)) : f = g \/ exists x, x \in E /\ f x != g x.
64+
Lemma gal_ne (F0 : fieldType) (L : splittingFieldType F0) (E : {subfield L}) (f g : gal_of E) : f = g \/ exists x, x \in E /\ f x != g x.
7165
Proof.
7266
move:(vbasisP E)=>/span_basis/agenv_span LE.
73-
case/boolP: (all (fun x => f x == g x) (vbasis E)) => [fgE | /allPn[x] xE fgx]; [ left | right ].
67+
case/boolP: (all (fun x => f x == g x) (vbasis E)) => [/allP fgE | /allPn[x] xE fgx]; [ left | right ].
7468
2: by exists x; split=>//; apply vbasis_mem.
7569
apply/eqP/gal_eqP.
76-
rewrite -{1}LE; apply ahom_eq_adjoin_seq=>//.
70+
rewrite -{1}LE; apply ahom_eq_adjoin_seq=>//; last by move=>x /fgE/eqP.
7771
move:(gal1 f)(gal1 g).
7872
rewrite gal_kHom ?sub1v// gal_kHom ?sub1v// => /andP [_ /subvP f1] /andP [_ /subvP g1].
7973
by move=>x /[dup] /f1/fixedSpaceP -> /g1/fixedSpaceP ->.
@@ -82,7 +76,7 @@ Qed.
8276
Lemma tnth_cons (T : Type) (x : T) (l : seq T) (i : 'I_(size l)): tnth (in_tuple (x :: l)) (lift ord0 i) = tnth (in_tuple l) i.
8377
Proof. by rewrite/tnth/=; apply set_nth_default. Qed.
8478

85-
Lemma gal_free (F0 : fieldType) (L : splittingFieldType F0) (E : {subfield L}) (f : seq (FinGroup.finType (gal_finGroupType E))) (k : 'I_(size f) -> L) : uniq f -> (forall i, k i = 0) \/ (exists a, a \in E /\ \sum_(i < size f) k i * tnth (in_tuple f) i a != 0).
79+
Lemma gal_free (F0 : fieldType) (L : splittingFieldType F0) (E : {subfield L}) (f : seq (gal_of E)) (k : 'I_(size f) -> L) : uniq f -> (forall i, k i = 0) \/ (exists a, a \in E /\ \sum_(i < size f) k i * tnth (in_tuple f) i a != 0).
8680
Proof.
8781
move:(Logic.eq_refl (size f)); generalize (size f) at 1 => n.
8882
elim: n f k => [|n IHn] f k fsize funiq.
@@ -101,27 +95,30 @@ case: (gal_ne s s0) => [/eqP ss0E | [x [xE /negPf ss0x]]].
10195
move:fsize=>/eqP; rewrite eqSS=>/eqP fsize.
10296
case: (IHn [:: s0 & f] (fun i => (k (lift ord0 i) * (tnth (in_tuple [:: s0 & f]) i x - s x))) fsize s0f).
10397
move=>/(_ ord0)/=/eqP; rewrite mulf_eq0 subr_eq0 [s0 x == _]eq_sym ss0x orbF => k10.
104-
set k' := fun i : 'I_(size f).+1 => k (if ord_S_split i then lift ord0 i else ord0).
98+
set k' := fun i : 'I_(size f).+1 => k
99+
(match splitP (i : 'I_(1 + size f)%N) with
100+
| SplitLo _ _ => ord0
101+
| SplitHi _ _ => lift ord0 i
102+
end).
105103
move: (IHn [:: s & f] k' fsize).
106104
have /[swap]/[apply]: uniq (s :: f) by apply/andP; split.
107105
case => [k0 | [a [aE fne0]]]; [left => i | right; exists a].
108106
case: i; case.
109107
move: (k0 ord0); rewrite/k'.
110-
case: (ord_S_split _) => [[i /=/(congr1 val)//] | /= _ /[swap] ilt].
111-
by congr (k _ = 0); apply val_inj.
108+
by case: splitP => // + _ + ilt => _; congr (k _ = 0); apply val_inj.
112109
case => [|i] ilt.
113110
by move: k10 => /eqP; congr (k _ = 0); apply val_inj.
114111
have ile: (i.+1 < (size f).+1)%N by rewrite -ltnS.
115112
move:(k0 (Ordinal ile)); rewrite/k'.
116-
case: (ord_S_split _) => [/= _| /[dup]/(congr1 val)//].
113+
case: splitP => [[j]/=/[swap]<-// | /= _ _].
117114
by congr (k _ = 0); apply val_inj.
118115
split=>//.
119116
move:k10 fne0 => /eqP k10.
120117
rewrite 3!big_ord_recl/= k10 mul0r add0r.
121118
congr (_ * _ + _ != 0).
122-
by rewrite/k'; case: (ord_S_split _) => // [[i]] /=/(congr1 val).
119+
by rewrite/k'; case: splitP => // [[i]] /=/(congr1 val).
123120
apply eq_bigr => i _; rewrite tnth_cons (@tnth_cons _ s (s0 :: f) (lift ord0 i)) tnth_cons; congr (_ * _).
124-
by rewrite/k'; case: (ord_S_split _).
121+
by rewrite/k'; case: splitP => // [[j]]/=/[swap]<-.
125122
move=>[y [yE fne0]]; right.
126123
case /boolP: (\sum_(i < (size f).+2) k i * tnth (in_tuple [:: s, s0 & f]) i y == 0) => [| yne0].
127124
2: by exists y.
@@ -157,12 +154,14 @@ move=> a f IHf.
157154
by rewrite 2!big_cons ffunE IHf.
158155
Qed.
159156

160-
161-
Definition Zp_succ n (i : 'I_n) := Ordinal (
162-
match n with
163-
| 0 => fun i0 : 'I_0 => match i0 with | @Ordinal _ _ i0 => i0 end
164-
| n0.+1 => fun i0 => (ltn_pmod i0.+1 (is_true_true : (is_true (0 < n0.+1)%N)))
165-
end i).
157+
Definition Zp_succ n (i : 'I_n) :=
158+
match i with
159+
| @Ordinal _ k klt => Ordinal (
160+
match n as n0 return (k < n0)%N -> (k.+1 %% n0 < n0)%N with
161+
| 0 => id
162+
| n0.+1 => fun=> ltn_pmod k.+1 (is_true_true : 0 < n0.+1)%N
163+
end klt)
164+
end.
166165

167166
Lemma cycle_imset [gT : finGroupType] (g : gT) : <[g]>%g = @Imset.imset (ordinal_finType #[g]%g) (FinGroup.finType gT) (fun i => (g ^+ (val i))%g) (mem setT).
168167
Proof.
@@ -192,7 +191,7 @@ Proof. by apply congr_big => // i; rewrite in_setT. Qed.
192191

193192
Lemma Hilbert's_theorem_90_additive
194193
[F : fieldType] [L : splittingFieldType F]
195-
[K E : {subfield L}] [x : gal_finGroupType E]
194+
[K E : {subfield L}] [x : gal_of E]
196195
[a : L] :
197196
galois K E ->
198197
generator 'Gal(E / K) x ->
@@ -320,30 +319,24 @@ have ->: ((if p \in primes m then p ^ logn p m else 1) = p ^ logn p m)%N.
320319
by rewrite -expnD subnK// vp_leq.
321320
Qed.
322321

323-
Lemma muln_gt0 [I : Type] (r : seq I) (P : pred I) (F : I -> nat) (p : nat) :
324-
all (fun n : I => P n ==> (0 < F n)%N) r ->
325-
(0 < \prod_(n <- r | P n) F n)%N.
326-
Proof.
327-
elim: r => [|n r IHn /andP[Fn0 Fr0]]; first by rewrite big_nil.
328-
rewrite big_cons; case /boolP: (P n) => Pn; last by apply IHn.
329-
rewrite muln_gt0.
330-
by move:Fn0; rewrite Pn/= IHn ?andbT.
331-
Qed.
332-
333-
Lemma logn_prod [I : Type] (r : seq I) (P : pred I) (F : I -> nat) (p : nat) :
334-
all (fun n : I => P n ==> (0 < F n)%N) r ->
322+
Lemma logn_prod [I : eqType] (r : seq I) (P : pred I) (F : I -> nat) (p : nat) :
323+
{in r, forall n, P n -> (0 < F n)%N} ->
335324
(logn p (\prod_(n <- r | P n) F n) = \sum_(n <- r | P n) logn p (F n))%N.
336325
Proof.
337-
elim: r => [|n r IHn /andP[Fn0 Fr0]]; first by rewrite 2!big_nil logn1.
326+
elim: r => [|n r IHn Fnr0]; first by rewrite 2!big_nil logn1.
327+
have Fr0: {in r, forall n : I, P n -> (0 < F n)%N}.
328+
by move=> i ir; apply Fnr0; rewrite in_cons ir orbT.
338329
rewrite 2!big_cons; case /boolP: (P n) => Pn; last by apply IHn.
339-
move:Fn0; rewrite Pn => /= Fn0.
340-
by rewrite lognM// ?muln_gt0// IHn.
330+
move:(Fnr0 n); rewrite mem_head Pn => /= /(_ is_true_true is_true_true) Fn0.
331+
rewrite lognM// ?IHn//.
332+
rewrite big_seq_cond big_mkcond prodn_gt0// => i.
333+
by case /boolP: ((i \in r) && P i) => // /andP[/Fr0].
341334
Qed.
342335

343336
Lemma logn_partn (p n : nat) (pi : nat_pred) :
344337
logn p (n`_pi)%N = ((p \in pi) * logn p n)%N.
345338
Proof.
346-
rewrite/partn logn_prod; last by apply/allP => i _; rewrite pfactor_gt0 implybT.
339+
rewrite/partn logn_prod; last by move=> i _; rewrite pfactor_gt0.
347340
under eq_bigr do rewrite lognX.
348341
have logp (i : nat): (i == p) || (logn i n * logn p i == 0)%N.
349342
case /boolP: (i == p) => //= /negPf ip.

0 commit comments

Comments
 (0)