@@ -59,6 +59,23 @@ Local Notation pQtoC := (map_poly ratr).
59
59
Local Definition intr_inj_ZtoC := (intr_inj : injective ZtoC).
60
60
#[local] Hint Resolve intr_inj_ZtoC : core.
61
61
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
+
62
79
(* Number fields and rational spans. *)
63
80
Lemma algC_PET (s : seq algC) :
64
81
{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]]]:
97
114
- set inQs := fieldExt_horner z1 in z1gen *; pose s1 := map inQs ps.
98
115
have inQsK p: QsC (inQs p) = (pQtoC p).[z].
99
116
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.
104
118
exists Qs, QsC, s1; first by rewrite -map_comp Ds (eq_map inQsK).
105
119
have sz_ps: size ps = size s by rewrite Ds size_map.
106
120
apply/vspaceP=> x; rewrite memvf; have [p {x}<-] := z1gen x.
@@ -126,16 +140,13 @@ Definition in_Crat_span s x :=
126
140
Fact Crat_span_subproof s x : decidable (in_Crat_span s x).
127
141
Proof .
128
142
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.
132
143
apply: decP (x1 \in <<in_tuple s1>>%VS) _; rewrite /in_Crat_span size_map.
133
144
apply: (iffP idP) => [/coord_span-> | [a Dx]].
134
145
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).
136
147
have{Dx} ->: x1 = \sum_i a i *: s1`_i.
137
148
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).
139
150
by apply: memv_suml => i _; rewrite memvZ ?memv_span ?mem_nth.
140
151
Qed .
141
152
@@ -162,23 +173,6 @@ Qed.
162
173
HB.instance Definition _ s := GRing.isZmodClosed.Build _ (Crat_span s)
163
174
(Crat_span_zmod_closed s).
164
175
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
-
182
176
Section NumFieldProj.
183
177
184
178
Variables (Qn : fieldExtType rat) (QnC : {rmorphism Qn -> algC}).
@@ -249,11 +243,9 @@ case: (splitting_field_normal 1%AS x) => rs /eqP Hrs.
249
243
have: root (map_poly (nu \o QnC) (minPoly 1%AS x)) (nu (QnC x)).
250
244
by rewrite fmorph_root root_minPoly.
251
245
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.
257
249
Qed .
258
250
259
251
(* Integral spans. *)
@@ -275,21 +267,18 @@ have enum_pairK j: {in predT, cancel (rank2 j) val21}.
275
267
have Qz_Zs a: inQzs (\sum_(i < m) s`_i *~ a i).
276
268
apply/forallP=> j; apply/Crat_spanP; rewrite /in_Crat_span size_map -cardE.
277
269
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 .
283
275
case Qz_v: (inQzs v); last by right=> [[a Dv]]; rewrite Dv Qz_Zs in Qz_v.
284
276
have [Qz [QzC [z1s Dz_s _]]] := num_field_exists z_s.
285
277
have sz_z1s: size z1s = #|IzT| by rewrite -(size_map QzC) Dz_s size_map cardE.
286
278
have xv j: {x | coord b j v = QzC x}.
287
279
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.
293
282
pose sz := [tuple [ffun j => z1s`_(rank2 j i)] | i < m].
294
283
have [Zsv | Zs'v] := dec_Qint_span sz [ffun j => sval (xv j)].
295
284
left; have{Zsv} [a Dv] := Zsv; exists a.
@@ -355,15 +344,10 @@ pose SubAut := existT _ _ (_, _) : subAut.
355
344
pose Sdom (mu : subAut) := projT1 mu.
356
345
pose Sinj (mu : subAut) : {rmorphism Sdom mu -> algC} := (projT2 mu).1.
357
346
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.
363
347
have Sinj_poly Qr (QrC : numF_inj Qr) p:
364
348
map_poly QrC (map_poly (in_alg Qr) p) = pQtoC p.
365
349
- rewrite -map_poly_comp; apply: eq_map_poly => a.
366
- by rewrite /= SinjZ rmorph1 mulr1.
350
+ by rewrite /= rmorphZ_num rmorph1 mulr1.
367
351
have ext1 mu0 x : {mu1 | exists y, x = Sinj mu1 y
368
352
& exists2 in01 : {lrmorphism _ -> _}, Sinj mu0 =1 Sinj mu1 \o in01
369
353
& {morph in01: y / Saut mu0 y >-> Saut mu1 y}}.
@@ -381,12 +365,12 @@ have ext1 mu0 x : {mu1 | exists y, x = Sinj mu1 y
381
365
have in01P y: {yy | Sinj mu0 y = QrC yy}.
382
366
exists (\sum_i coord b0 i y *: (map_poly (in_alg Qr) ps`_i).[zz]).
383
367
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.
385
369
rewrite -horner_map Dz Sinj_poly (nth_map 0) //.
386
370
by have:= congr1 size Ds; rewrite !size_map size_tuple => <-.
387
371
pose in01 y := sval (in01P y).
388
372
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).
390
374
have in01a : additive in01.
391
375
by move=> ? ?; apply: (fmorph_inj QrC); rewrite !rwM.
392
376
have in01m : multiplicative in01.
@@ -428,15 +412,14 @@ have ext1 mu0 x : {mu1 | exists y, x = Sinj mu1 y
428
412
apply: splittingFieldForS (sub1v (Sub K algK)) (subvf _) _; exists rr => //.
429
413
congr (_ %= _): (eqpxx pr); apply/(map_poly_inj QrC).
430
414
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 .
432
416
have [f1 aut_f1 Df1]:= kHom_extends (sub1v (ASpace algK)) hom_f Qpr splitQr.
433
417
pose f1mM := GRing.isMultiplicative.Build _ _ f1 (kHom_lrmorphism aut_f1).
434
418
pose nu : {lrmorphism _ -> _} := HB.pack (fun_of_lfun f1) f1mM.
435
419
exists (SubAut Qr QrC nu) => //; exists in01 => //= y.
436
420
by rewrite -Df -Df1 //; apply/memK; exists y.
437
421
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.
440
423
pose philM := GRing.isScalable.Build _ _ _ _ phi phiZ.
441
424
pose phiLRM : {lrmorphism _ -> _} := HB.pack (GRing.RMorphism.sort phi) philM.
442
425
pose fix ext n :=
@@ -503,8 +486,7 @@ have pzn_zk0: root (map_poly \1%VF (minPoly 1 zn)) (zn ^+ k).
503
486
exists (\poly_(i < size (minPoly 1 zn)) sval (a_ i)).
504
487
apply/polyP=> i; rewrite coef_poly coef_map coef_poly /=.
505
488
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.
508
490
have: root p1 z by rewrite -Dz fmorph_root root_minPoly.
509
491
rewrite Dp1; have [q2 [Dq2 _] ->] := minCpolyP z.
510
492
case/dvdpP=> r1 ->; rewrite rmorphM rootM /= -Dq2; apply/orP; right.
0 commit comments