Skip to content

Commit 1a73455

Browse files
authored
Merge pull request math-comp#1274 from math-comp/cleanup-1125
Cherry-pick from math-comp#1125, and cleanup algnum.v
2 parents 6df6f32 + 5ede8b5 commit 1a73455

File tree

7 files changed

+47
-68
lines changed

7 files changed

+47
-68
lines changed

mathcomp/algebra/mxpoly.v

+4-5
Original file line numberDiff line numberDiff line change
@@ -341,9 +341,8 @@ Definition powers_mx d := \matrix_(i < d) mxvec (A ^+ i).
341341
Lemma horner_rVpoly m (u : 'rV_m) :
342342
horner_mx (rVpoly u) = vec_mx (u *m powers_mx m).
343343
Proof.
344-
rewrite mulmx_sum_row linear_sum [rVpoly u]poly_def rmorph_sum.
345-
apply: eq_bigr => i _.
346-
by rewrite valK /= !linearZ rmorphXn /= horner_mx_X rowK mxvecK.
344+
rewrite mulmx_sum_row [rVpoly u]poly_def 2!linear_sum; apply: eq_bigr => i _.
345+
by rewrite valK /= 2!linearZ rmorphXn/= horner_mx_X rowK mxvecK.
347346
Qed.
348347

349348
End OneMatrix.
@@ -354,8 +353,8 @@ Proof.
354353
apply/matrixP => i j; rewrite !mxE.
355354
elim/poly_ind: p => [|p c ihp]; first by rewrite rmorph0 horner0 mxE mul0rn.
356355
rewrite !hornerE mulrnDl rmorphD rmorphM /= horner_mx_X horner_mx_C !mxE.
357-
rewrite (bigD1 j)//= ihp mxE ?eqxx mulr1n -mulrnAl big1 ?addr0//.
358-
by case: (altP (i =P j)) => [->|]; rewrite /= !(mulr1n, addr0, mul0r).
356+
rewrite (bigD1 j)//= ihp mxE eqxx mulr1n -mulrnAl big1 ?addr0.
357+
by have [->|_] := eqVneq; rewrite /= !(mulr1n, addr0, mul0r).
359358
by move=> k /negPf nkF; rewrite mxE nkF mulr0.
360359
Qed.
361360

mathcomp/algebra/vector.v

+2-2
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ Qed.
402402

403403
Fact memv_submod_closed U : submod_closed U.
404404
Proof.
405-
split=> [|a u v]; rewrite !memvK ?linear0 ?sub0mx // => Uu Uv.
405+
split=> [|a u v]; rewrite !memvK 1?linear0 1?sub0mx // => Uu Uv.
406406
by rewrite linearP addmx_sub ?scalemx_sub.
407407
Qed.
408408
HB.instance Definition _ (U : {vspace vT}) :=
@@ -1011,7 +1011,7 @@ Qed.
10111011
Lemma coord_sum_free n (X : n.-tuple vT) k j :
10121012
free X -> coord X j (\sum_(i < n) k i *: X`_i) = k j.
10131013
Proof.
1014-
move=> Xfree; rewrite linear_sum (bigD1 j) ?linearZ //= coord_free // eqxx.
1014+
move=> Xfree; rewrite linear_sum (bigD1 j) 1?linearZ //= coord_free // eqxx.
10151015
rewrite mulr1 big1 ?addr0 // => i /negPf j'i.
10161016
by rewrite linearZ /= coord_free // j'i mulr0.
10171017
Qed.

mathcomp/character/character.v

+2-2
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ HB.instance Definition _ n1 m2 n2 A :=
126126
GRing.isLinear.Build _ _ _ _ (@trow n1 A m2 n2)
127127
(@trow_is_linear n1 m2 n2 A).
128128

129-
Fixpoint tprod (m1 : nat) :
129+
Fixpoint tprod (m1 : nat) :
130130
forall n1 (A : 'M[F]_(m1,n1)) m2 n2 (B : 'M[F]_(m2,n2)),
131131
'M[F]_(m1 * m2,n1 * n2) :=
132132
if m1 is m'1.+1
@@ -496,7 +496,7 @@ Definition xcfun (chi : 'CF(G)) A :=
496496
(gring_row A *m (\col_(i < #|G|) chi (enum_val i))) 0 0.
497497

498498
Lemma xcfun_is_additive phi : additive (xcfun phi).
499-
Proof. by move=> A B; rewrite /xcfun linearB mulmxBl !mxE. Qed.
499+
Proof. by move=> A B; rewrite /xcfun [gring_row _]linearB mulmxBl !mxE. Qed.
500500
HB.instance Definition _ phi :=
501501
GRing.isAdditive.Build 'M_(gcard G) _ (xcfun phi) (xcfun_is_additive phi).
502502

mathcomp/character/mxrepresentation.v

+1-2
Original file line numberDiff line numberDiff line change
@@ -4352,8 +4352,7 @@ Qed.
43524352

43534353
Lemma rank_irr_comp : \rank 'R_iG = \rank E_G.
43544354
Proof.
4355-
symmetry; rewrite -{1}irr_comp_envelop; apply/mxrank_injP.
4356-
by rewrite ker_irr_comp_op.
4355+
by rewrite -irr_comp_envelop; apply/esym/mxrank_injP; rewrite ker_irr_comp_op.
43574356
Qed.
43584357

43594358
End IrrComponent.

mathcomp/field/algnum.v

+36-54
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,23 @@ Local Notation pQtoC := (map_poly ratr).
5959
Local Definition intr_inj_ZtoC := (intr_inj : injective ZtoC).
6060
#[local] Hint Resolve intr_inj_ZtoC : core.
6161

62+
Section MoreAlgCaut.
63+
64+
Implicit Type rR : unitRingType.
65+
66+
Lemma alg_num_field (Qz : fieldExtType rat) a : a%:A = ratr a :> Qz.
67+
Proof. by rewrite -in_algE fmorph_eq_rat. Qed.
68+
69+
Lemma rmorphZ_num (Qz : fieldExtType rat) rR (f : {rmorphism Qz -> rR}) a x :
70+
f (a *: x) = ratr a * f x.
71+
Proof. by rewrite -mulr_algl rmorphM alg_num_field fmorph_rat. Qed.
72+
73+
Lemma fmorph_numZ (Qz1 Qz2 : fieldExtType rat) (f : {rmorphism Qz1 -> Qz2}) :
74+
scalable f.
75+
Proof. by move=> a x; rewrite rmorphZ_num -alg_num_field mulr_algl. Qed.
76+
77+
End MoreAlgCaut.
78+
6279
(* Number fields and rational spans. *)
6380
Lemma algC_PET (s : seq algC) :
6481
{z | exists a : nat ^ size s, z = \sum_(i < size s) s`_i *+ a i
@@ -97,10 +114,7 @@ suffices [Qs [QsC [z1 z1C z1gen]]]:
97114
- set inQs := fieldExt_horner z1 in z1gen *; pose s1 := map inQs ps.
98115
have inQsK p: QsC (inQs p) = (pQtoC p).[z].
99116
rewrite /= -horner_map z1C -map_poly_comp; congr _.[z].
100-
apply: eq_map_poly => b /=; apply: canRL (mulfK _) _.
101-
by rewrite intr_eq0 denq_eq0.
102-
rewrite /= mulrzr -rmorphMz scalerMzl -{1}[b]divq_num_den -mulrzr.
103-
by rewrite divfK ?intr_eq0 ?denq_eq0 // scaler_int rmorph_int.
117+
by apply: eq_map_poly => b /=; rewrite alg_num_field fmorph_rat.
104118
exists Qs, QsC, s1; first by rewrite -map_comp Ds (eq_map inQsK).
105119
have sz_ps: size ps = size s by rewrite Ds size_map.
106120
apply/vspaceP=> x; rewrite memvf; have [p {x}<-] := z1gen x.
@@ -126,16 +140,13 @@ Definition in_Crat_span s x :=
126140
Fact Crat_span_subproof s x : decidable (in_Crat_span s x).
127141
Proof.
128142
have [Qxs [QxsC [[|x1 s1] // [<- <-] {x s} _]]] := num_field_exists (x :: s).
129-
have QxsC_Z a zz: QxsC (a *: zz) = QtoC a * QxsC zz.
130-
rewrite mulrAC; apply: (canRL (mulfK _)); first by rewrite intr_eq0 denq_eq0.
131-
by rewrite mulrzr mulrzl -!rmorphMz scalerMzl -mulrzr -numqE scaler_int.
132143
apply: decP (x1 \in <<in_tuple s1>>%VS) _; rewrite /in_Crat_span size_map.
133144
apply: (iffP idP) => [/coord_span-> | [a Dx]].
134145
move: (coord _) => a; exists [ffun i => a i x1]; rewrite rmorph_sum /=.
135-
by apply: eq_bigr => i _; rewrite ffunE (nth_map 0).
146+
by apply: eq_bigr => i _; rewrite ffunE rmorphZ_num (nth_map 0).
136147
have{Dx} ->: x1 = \sum_i a i *: s1`_i.
137148
apply: (fmorph_inj QxsC); rewrite Dx rmorph_sum /=.
138-
by apply: eq_bigr => i _; rewrite QxsC_Z (nth_map 0).
149+
by apply: eq_bigr => i _; rewrite rmorphZ_num (nth_map 0).
139150
by apply: memv_suml => i _; rewrite memvZ ?memv_span ?mem_nth.
140151
Qed.
141152

@@ -162,23 +173,6 @@ Qed.
162173
HB.instance Definition _ s := GRing.isZmodClosed.Build _ (Crat_span s)
163174
(Crat_span_zmod_closed s).
164175

165-
Section MoreAlgCaut.
166-
167-
Implicit Type rR : unitRingType.
168-
169-
Lemma alg_num_field (Qz : fieldExtType rat) a : a%:A = ratr a :> Qz.
170-
Proof. by rewrite -in_algE fmorph_eq_rat. Qed.
171-
172-
Lemma rmorphZ_num (Qz : fieldExtType rat) rR (f : {rmorphism Qz -> rR}) a x :
173-
f (a *: x) = ratr a * f x.
174-
Proof. by rewrite -mulr_algl rmorphM /= alg_num_field fmorph_rat. Qed.
175-
176-
Lemma fmorph_numZ (Qz1 Qz2 : fieldExtType rat) (f : {rmorphism Qz1 -> Qz2}) :
177-
scalable f.
178-
Proof. by move=> a x; rewrite rmorphZ_num -alg_num_field mulr_algl. Qed.
179-
180-
End MoreAlgCaut.
181-
182176
Section NumFieldProj.
183177

184178
Variables (Qn : fieldExtType rat) (QnC : {rmorphism Qn -> algC}).
@@ -249,11 +243,9 @@ case: (splitting_field_normal 1%AS x) => rs /eqP Hrs.
249243
have: root (map_poly (nu \o QnC) (minPoly 1%AS x)) (nu (QnC x)).
250244
by rewrite fmorph_root root_minPoly.
251245
rewrite map_Qnum_poly ?minPolyOver // Hrs.
252-
rewrite [map_poly _ _](_:_ = \prod_(y <- map QnC rs) ('X - y%:P)); last first.
253-
rewrite big_map rmorph_prod /=; apply: eq_bigr => i _.
254-
by rewrite rmorphB /= map_polyX map_polyC.
255-
rewrite root_prod_XsubC.
256-
by case/mapP => y _ ?; exists y.
246+
rewrite [map_poly _ _](_:_ = \prod_(y <- map QnC rs) ('X - y%:P)).
247+
by rewrite root_prod_XsubC; case/mapP => y _ ?; exists y.
248+
by rewrite big_map rmorph_prod /=; apply: eq_bigr => i _; rewrite map_polyXsubC.
257249
Qed.
258250

259251
(* Integral spans. *)
@@ -275,21 +267,18 @@ have enum_pairK j: {in predT, cancel (rank2 j) val21}.
275267
have Qz_Zs a: inQzs (\sum_(i < m) s`_i *~ a i).
276268
apply/forallP=> j; apply/Crat_spanP; rewrite /in_Crat_span size_map -cardE.
277269
exists [ffun ij => (a (val21 ij))%:Q *+ ((enum_val ij).2 == j)].
278-
rewrite linear_sum {1}(reindex_onto _ _ (enum_pairK j)).
279-
rewrite big_mkcond; apply: eq_bigr => ij _ /=; rewrite nth_image (tnth_nth 0).
280-
rewrite (can2_eq (@enum_rankK _) (@enum_valK _)) ffunE -scaler_int /val21.
281-
case Dij: (enum_val ij) => [i j1]; rewrite xpair_eqE eqxx /= eq_sym -mulrb.
282-
by rewrite linearZ rmorphMn /= rmorph_int mulrnAl; case: eqP => // ->.
270+
rewrite linear_sum {1}(reindex_onto _ _ (enum_pairK j)) big_mkcond /=.
271+
apply: eq_bigr => ij _ /=; rewrite nth_image (tnth_nth 0) ffunE /val21.
272+
rewrite raddfMz rmorphMn rmorph_int mulrnAl mulrzl /=.
273+
rewrite (can2_eq (@enum_rankK _) (@enum_valK _)).
274+
by case: (enum_val ij) => i j1; rewrite xpair_eqE eqxx; have [->|] := eqVneq.
283275
case Qz_v: (inQzs v); last by right=> [[a Dv]]; rewrite Dv Qz_Zs in Qz_v.
284276
have [Qz [QzC [z1s Dz_s _]]] := num_field_exists z_s.
285277
have sz_z1s: size z1s = #|IzT| by rewrite -(size_map QzC) Dz_s size_map cardE.
286278
have xv j: {x | coord b j v = QzC x}.
287279
apply: sig_eqW; have /Crat_spanP[x ->] := forallP Qz_v j.
288-
exists (\sum_ij x ij *: z1s`_ij); rewrite rmorph_sum.
289-
apply: eq_bigr => ij _; rewrite mulrAC.
290-
apply: canLR (mulfK _) _; first by rewrite intr_eq0 denq_neq0.
291-
rewrite mulrzr -rmorphMz scalerMzl -(mulrzr (x _)) -numqE scaler_int.
292-
by rewrite rmorphMz mulrzl -(nth_map _ 0) ?Dz_s // -(size_map QzC) Dz_s.
280+
exists (\sum_ij x ij *: z1s`_ij); rewrite rmorph_sum; apply: eq_bigr => ij _.
281+
by rewrite rmorphZ_num -[in RHS](nth_map _ 0) ?Dz_s // -(size_map QzC) Dz_s.
293282
pose sz := [tuple [ffun j => z1s`_(rank2 j i)] | i < m].
294283
have [Zsv | Zs'v] := dec_Qint_span sz [ffun j => sval (xv j)].
295284
left; have{Zsv} [a Dv] := Zsv; exists a.
@@ -355,15 +344,10 @@ pose SubAut := existT _ _ (_, _) : subAut.
355344
pose Sdom (mu : subAut) := projT1 mu.
356345
pose Sinj (mu : subAut) : {rmorphism Sdom mu -> algC} := (projT2 mu).1.
357346
pose Saut (mu : subAut) : {rmorphism Sdom mu -> Sdom mu} := (projT2 mu).2.
358-
have SinjZ Qr (QrC : numF_inj Qr) a x: QrC (a *: x) = QtoC a * QrC x.
359-
rewrite mulrAC; apply: canRL (mulfK _) _.
360-
by rewrite intr_eq0 denq_neq0.
361-
by rewrite mulrzr mulrzl -!rmorphMz scalerMzl -[x *~ _]scaler_int -mulrzr
362-
-numqE.
363347
have Sinj_poly Qr (QrC : numF_inj Qr) p:
364348
map_poly QrC (map_poly (in_alg Qr) p) = pQtoC p.
365349
- rewrite -map_poly_comp; apply: eq_map_poly => a.
366-
by rewrite /= SinjZ rmorph1 mulr1.
350+
by rewrite /= rmorphZ_num rmorph1 mulr1.
367351
have ext1 mu0 x : {mu1 | exists y, x = Sinj mu1 y
368352
& exists2 in01 : {lrmorphism _ -> _}, Sinj mu0 =1 Sinj mu1 \o in01
369353
& {morph in01: y / Saut mu0 y >-> Saut mu1 y}}.
@@ -381,12 +365,12 @@ have ext1 mu0 x : {mu1 | exists y, x = Sinj mu1 y
381365
have in01P y: {yy | Sinj mu0 y = QrC yy}.
382366
exists (\sum_i coord b0 i y *: (map_poly (in_alg Qr) ps`_i).[zz]).
383367
rewrite {1}(coord_vbasis (memvf y)) !rmorph_sum /=; apply: eq_bigr => i _.
384-
rewrite !SinjZ; congr (_ * _); rewrite -(nth_map _ 0) ?size_tuple // Ds.
368+
rewrite 2!rmorphZ_num -(nth_map _ 0) ?size_tuple // Ds.
385369
rewrite -horner_map Dz Sinj_poly (nth_map 0) //.
386370
by have:= congr1 size Ds; rewrite !size_map size_tuple => <-.
387371
pose in01 y := sval (in01P y).
388372
have Din01 y: Sinj mu0 y = QrC (in01 y) by rewrite /in01; case: (in01P y).
389-
pose rwM := (=^~ Din01, SinjZ, rmorph1, rmorphB, rmorphM).
373+
pose rwM := (=^~ Din01, rmorphZ_num, rmorph1, rmorphB, rmorphM).
390374
have in01a : additive in01.
391375
by move=> ? ?; apply: (fmorph_inj QrC); rewrite !rwM.
392376
have in01m : multiplicative in01.
@@ -428,15 +412,14 @@ have ext1 mu0 x : {mu1 | exists y, x = Sinj mu1 y
428412
apply: splittingFieldForS (sub1v (Sub K algK)) (subvf _) _; exists rr => //.
429413
congr (_ %= _): (eqpxx pr); apply/(map_poly_inj QrC).
430414
rewrite Sinj_poly Dr -Drr big_map rmorph_prod /=; apply: eq_bigr => zz _.
431-
by rewrite rmorphB /= map_polyX map_polyC.
415+
by rewrite map_polyXsubC.
432416
have [f1 aut_f1 Df1]:= kHom_extends (sub1v (ASpace algK)) hom_f Qpr splitQr.
433417
pose f1mM := GRing.isMultiplicative.Build _ _ f1 (kHom_lrmorphism aut_f1).
434418
pose nu : {lrmorphism _ -> _} := HB.pack (fun_of_lfun f1) f1mM.
435419
exists (SubAut Qr QrC nu) => //; exists in01 => //= y.
436420
by rewrite -Df -Df1 //; apply/memK; exists y.
437421
have phiZ: scalable phi.
438-
move=> a y; do 2!rewrite -mulr_algl -in_algE; rewrite -[a]divq_num_den.
439-
by rewrite fmorph_div rmorphM [X in X * _]fmorph_div !rmorph_int.
422+
by move=> a y; rewrite rmorphZ_num -alg_num_field mulr_algl.
440423
pose philM := GRing.isScalable.Build _ _ _ _ phi phiZ.
441424
pose phiLRM : {lrmorphism _ -> _} := HB.pack (GRing.RMorphism.sort phi) philM.
442425
pose fix ext n :=
@@ -503,8 +486,7 @@ have pzn_zk0: root (map_poly \1%VF (minPoly 1 zn)) (zn ^+ k).
503486
exists (\poly_(i < size (minPoly 1 zn)) sval (a_ i)).
504487
apply/polyP=> i; rewrite coef_poly coef_map coef_poly /=.
505488
case: ifP => _; rewrite ?rmorph0 //; case: (a_ i) => a /= ->.
506-
apply: canRL (mulfK _) _; first by rewrite intr_eq0 denq_eq0.
507-
by rewrite mulrzr -rmorphMz scalerMzl -mulrzr -numqE scaler_int rmorph_int.
489+
by rewrite alg_num_field fmorph_rat.
508490
have: root p1 z by rewrite -Dz fmorph_root root_minPoly.
509491
rewrite Dp1; have [q2 [Dq2 _] ->] := minCpolyP z.
510492
case/dvdpP=> r1 ->; rewrite rmorphM rootM /= -Dq2; apply/orP; right.

mathcomp/field/fieldext.v

+1-2
Original file line numberDiff line numberDiff line change
@@ -545,8 +545,7 @@ move=> a p; rewrite -mul_polyC rmorphM /= fieldExt_hornerC.
545545
by rewrite -scalerAl mul1r.
546546
Qed.
547547
HB.instance Definition _ :=
548-
GRing.isScalable.Build F0 {poly F0} L *:%R fieldExt_horner
549-
fieldExt_hornerZ.
548+
GRing.isScalable.Build F0 {poly F0} L *:%R fieldExt_horner fieldExt_hornerZ.
550549

551550
End Horner.
552551

mathcomp/field/galois.v

+1-1
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ Variables (K E : {subfield L}) (f : 'End(L)) (x y : L).
193193
Let kHomf z := (map_poly f (Fadjoin_poly E x z)).[y].
194194

195195
Fact kHomExtend_additive_subproof : additive kHomf.
196-
Proof. by move=> a b; rewrite /kHomf !raddfB hornerD hornerN. Qed.
196+
Proof. by move=> a b; rewrite /kHomf 2!raddfB hornerD hornerN. Qed.
197197

198198
Fact kHomExtend_scalable_subproof : scalable kHomf.
199199
Proof.

0 commit comments

Comments
 (0)