@@ -239,17 +239,17 @@ finsupp.induction p (suffices P (monomial 0 0), by rwa monomial_zero at this,
239
239
240
240
241
241
lemma hom_eq_hom [semiring γ]
242
- (f g : mv_polynomial σ α → γ) (hf : is_semiring_hom f) (hg : is_semiring_hom g )
242
+ (f g : mv_polynomial σ α →+* γ )
243
243
(hC : ∀a:α, f (C a) = g (C a)) (hX : ∀n:σ, f (X n) = g (X n)) (p : mv_polynomial σ α) :
244
244
f p = g p :=
245
245
mv_polynomial.induction_on p hC
246
246
begin assume p q hp hq, rw [is_semiring_hom.map_add f, is_semiring_hom.map_add g, hp, hq] end
247
247
begin assume p n hp, rw [is_semiring_hom.map_mul f, is_semiring_hom.map_mul g, hp, hX] end
248
248
249
- lemma is_id (f : mv_polynomial σ α → mv_polynomial σ α) (hf : is_semiring_hom f )
249
+ lemma is_id (f : mv_polynomial σ α →+* mv_polynomial σ α)
250
250
(hC : ∀a:α, f (C a) = (C a)) (hX : ∀n:σ, f (X n) = (X n)) (p : mv_polynomial σ α) :
251
251
f p = p :=
252
- hom_eq_hom f id hf is_semiring_hom .id hC hX p
252
+ hom_eq_hom f (ring_hom .id _) hC hX p
253
253
254
254
section coeff
255
255
@@ -593,13 +593,11 @@ end eval
593
593
594
594
section map
595
595
variables [comm_semiring β]
596
- variables (f : α → β)
596
+ variables (f : α →+* β)
597
597
598
598
/-- `map f p` maps a polynomial `p` across a ring hom `f` -/
599
599
def map : mv_polynomial σ α → mv_polynomial σ β := eval₂ (C ∘ f) X
600
600
601
- variables [is_semiring_hom f]
602
-
603
601
instance is_semiring_hom_C_f :
604
602
is_semiring_hom ((C : β → mv_polynomial σ β) ∘ f) :=
605
603
is_semiring_hom.comp _ _
@@ -626,12 +624,12 @@ instance map.is_semiring_hom :
626
624
is_semiring_hom (map f : mv_polynomial σ α → mv_polynomial σ β) :=
627
625
eval₂.is_semiring_hom _ _
628
626
629
- theorem map_id : ∀ (p : mv_polynomial σ α), map id p = p := eval₂_eta
627
+ theorem map_id : ∀ (p : mv_polynomial σ α), map (ring_hom.id α) p = p := eval₂_eta
630
628
631
629
theorem map_map [comm_semiring γ]
632
- (g : β → γ) [is_semiring_hom g]
630
+ (g : β →+* γ)
633
631
(p : mv_polynomial σ α) :
634
- map g (map f p) = map (g ∘ f) p :=
632
+ map g (map f p) = map (g.comp f) p :=
635
633
(eval₂_comp_left (map g) (C ∘ f) X p).trans $
636
634
by congr; funext a; simp
637
635
@@ -644,8 +642,7 @@ begin
644
642
end
645
643
646
644
lemma eval₂_comp_right {γ} [comm_semiring γ]
647
- (k : β → γ) [is_semiring_hom k]
648
- (f : α → β) [is_semiring_hom f] (g : σ → β)
645
+ (k : β →+* γ) (f : α →+* β) (g : σ → β)
649
646
(p) : k (eval₂ f g p) = eval₂ k (k ∘ g) (map f p) :=
650
647
begin
651
648
apply mv_polynomial.induction_on p,
@@ -655,7 +652,7 @@ begin
655
652
rw [eval₂_mul, is_semiring_hom.map_mul k, map_mul, eval₂_mul, map_X, hp, eval₂_X, eval₂_X] }
656
653
end
657
654
658
- lemma map_eval₂ (f : α → β) [is_semiring_hom f] (g : γ → mv_polynomial δ α) (p : mv_polynomial γ α) :
655
+ lemma map_eval₂ (f : α →+* β) (g : γ → mv_polynomial δ α) (p : mv_polynomial γ α) :
659
656
map f (eval₂ C g p) = eval₂ C (map f ∘ g) (map f p) :=
660
657
begin
661
658
apply mv_polynomial.induction_on p,
@@ -1074,7 +1071,7 @@ end eval
1074
1071
section map
1075
1072
1076
1073
variables [comm_ring β]
1077
- variables (f : α → β) [is_ring_hom f]
1074
+ variables (f : α →+* β)
1078
1075
1079
1076
instance is_ring_hom_C_f : is_ring_hom ((C : β → mv_polynomial σ β) ∘ f) :=
1080
1077
is_ring_hom.comp _ _
@@ -1151,7 +1148,7 @@ eval₂_mul _ _
1151
1148
rename f (p^n) = (rename f p)^n :=
1152
1149
eval₂_pow _ _
1153
1150
1154
- lemma map_rename [comm_semiring β] (f : α → β) [is_semiring_hom f]
1151
+ lemma map_rename [comm_semiring β] (f : α →+* β)
1155
1152
(g : γ → δ) (p : mv_polynomial γ α) :
1156
1153
map f (rename g p) = rename g (map f p) :=
1157
1154
mv_polynomial.induction_on p
@@ -1289,7 +1286,8 @@ variables (α) [comm_semiring α]
1289
1286
def pempty_ring_equiv : mv_polynomial pempty α ≃+* α :=
1290
1287
{ to_fun := mv_polynomial.eval₂ id $ pempty.elim,
1291
1288
inv_fun := C,
1292
- left_inv := is_id _ (by apply_instance) (assume a, by rw [eval₂_C]; refl) (assume a, a.elim),
1289
+ left_inv := is_id (C.comp (ring_hom.of (eval₂ id pempty.elim)))
1290
+ (assume a : α, by { dsimp, rw [eval₂_C], refl }) (assume a, a.elim),
1293
1291
right_inv := λ r, eval₂_C _ _ _,
1294
1292
map_mul' := λ _ _, eval₂_mul _ _,
1295
1293
map_add' := λ _ _, eval₂_add _ _ }
@@ -1303,10 +1301,11 @@ def punit_ring_equiv : mv_polynomial punit α ≃+* polynomial α :=
1303
1301
inv_fun := polynomial.eval₂ mv_polynomial.C (X punit.star),
1304
1302
left_inv :=
1305
1303
begin
1306
- refine is_id _ _ _ _,
1307
- apply is_semiring_hom.comp (eval₂ polynomial.C (λu:punit, polynomial.X)) _; apply_instance,
1308
- { assume a, rw [eval₂_C, polynomial.eval₂_C] },
1309
- { rintros ⟨⟩, rw [eval₂_X, polynomial.eval₂_X] }
1304
+ refine is_id
1305
+ ((ring_hom.of (polynomial.eval₂ mv_polynomial.C (X punit.star))).comp
1306
+ (ring_hom.of (eval₂ polynomial.C (λu:punit, polynomial.X)))) _ _,
1307
+ { assume a, dsimp, rw [eval₂_C, polynomial.eval₂_C] },
1308
+ { rintros ⟨⟩, dsimp, rw [eval₂_X, polynomial.eval₂_X] }
1310
1309
end ,
1311
1310
right_inv := assume p, polynomial.induction_on p
1312
1311
(assume a, by rw [polynomial.eval₂_C, mv_polynomial.eval₂_C])
@@ -1331,11 +1330,11 @@ def ring_equiv_congr [comm_semiring γ] (e : α ≃+* γ) : mv_polynomial β α
1331
1330
{ to_fun := map e,
1332
1331
inv_fun := map e.symm,
1333
1332
left_inv := assume p,
1334
- have (e.symm ∘ e ) = id ,
1333
+ have (e.symm : γ →+* α).comp (e : α →+* γ ) = ring_hom.id _ ,
1335
1334
{ ext a, exact e.symm_apply_apply a },
1336
1335
by simp only [map_map, this , map_id],
1337
1336
right_inv := assume p,
1338
- have (e ∘ e.symm) = id ,
1337
+ have (e : α →+* γ).comp ( e.symm : γ →+* α ) = ring_hom.id _ ,
1339
1338
{ ext a, exact e.apply_symm_apply a },
1340
1339
by simp only [map_map, this , map_id],
1341
1340
map_mul' := map_mul _,
@@ -1351,12 +1350,8 @@ with coefficents in multivariable polynomials in the other type.
1351
1350
1352
1351
See `sum_ring_equiv` for the ring isomorphism.
1353
1352
-/
1354
- def sum_to_iter : mv_polynomial (β ⊕ γ) α → mv_polynomial β (mv_polynomial γ α) :=
1355
- eval₂ (C ∘ C) (λbc, sum.rec_on bc X (C ∘ X))
1356
-
1357
- instance is_semiring_hom_C_C :
1358
- is_semiring_hom (C ∘ C : α → mv_polynomial β (mv_polynomial γ α)) :=
1359
- @is_semiring_hom.comp _ _ _ _ C _ _ _ C _
1353
+ def sum_to_iter : mv_polynomial (β ⊕ γ) α →+* mv_polynomial β (mv_polynomial γ α) :=
1354
+ eval₂_hom (C.comp C) (λbc, sum.rec_on bc X (C ∘ X))
1360
1355
1361
1356
instance is_semiring_hom_sum_to_iter : is_semiring_hom (sum_to_iter α β γ) :=
1362
1357
eval₂.is_semiring_hom _ _
@@ -1377,11 +1372,8 @@ to multivariable polynomials in the sum of the two types.
1377
1372
1378
1373
See `sum_ring_equiv` for the ring isomorphism.
1379
1374
-/
1380
- def iter_to_sum : mv_polynomial β (mv_polynomial γ α) → mv_polynomial (β ⊕ γ) α :=
1381
- eval₂ (eval₂ C (X ∘ sum.inr)) (X ∘ sum.inl)
1382
-
1383
- instance is_semiring_hom_iter_to_sum : is_semiring_hom (iter_to_sum α β γ) :=
1384
- eval₂.is_semiring_hom _ _
1375
+ def iter_to_sum : mv_polynomial β (mv_polynomial γ α) →+* mv_polynomial (β ⊕ γ) α :=
1376
+ eval₂_hom (ring_hom.of (eval₂ C (X ∘ sum.inr))) (X ∘ sum.inl)
1385
1377
1386
1378
lemma iter_to_sum_C_C (a : α) : iter_to_sum α β γ (C (C a)) = C a :=
1387
1379
eq.trans (eval₂_C _ _ (C a)) (eval₂_C _ _ _)
@@ -1394,18 +1386,18 @@ eq.trans (eval₂_C _ _ (X c)) (eval₂_X _ _ _)
1394
1386
1395
1387
/-- A helper function for `sum_ring_equiv`. -/
1396
1388
def mv_polynomial_equiv_mv_polynomial [comm_semiring δ]
1397
- (f : mv_polynomial β α → mv_polynomial γ δ) (hf : is_semiring_hom f )
1398
- (g : mv_polynomial γ δ → mv_polynomial β α) (hg : is_semiring_hom g )
1389
+ (f : mv_polynomial β α →+* mv_polynomial γ δ)
1390
+ (g : mv_polynomial γ δ →+* mv_polynomial β α)
1399
1391
(hfgC : ∀a, f (g (C a)) = C a)
1400
1392
(hfgX : ∀n, f (g (X n)) = X n)
1401
1393
(hgfC : ∀a, g (f (C a)) = C a)
1402
1394
(hgfX : ∀n, g (f (X n)) = X n) :
1403
1395
mv_polynomial β α ≃+* mv_polynomial γ δ :=
1404
1396
{ to_fun := f, inv_fun := g,
1405
- left_inv := is_id _ (is_semiring_hom .comp _ _) hgfC hgfX,
1406
- right_inv := is_id _ (is_semiring_hom .comp _ _) hfgC hfgX,
1407
- map_mul' := hf .map_mul,
1408
- map_add' := hf .map_add }
1397
+ left_inv := is_id (ring_hom .comp _ _) hgfC hgfX,
1398
+ right_inv := is_id (ring_hom .comp _ _) hfgC hfgX,
1399
+ map_mul' := f .map_mul,
1400
+ map_add' := f .map_add }
1409
1401
1410
1402
/--
1411
1403
The ring isomorphism between multivariable polynomials in a sum of two types,
@@ -1415,27 +1407,16 @@ with coefficents in multivariable polynomials in the other type.
1415
1407
def sum_ring_equiv : mv_polynomial (β ⊕ γ) α ≃+* mv_polynomial β (mv_polynomial γ α) :=
1416
1408
begin
1417
1409
apply @mv_polynomial_equiv_mv_polynomial α (β ⊕ γ) _ _ _ _
1418
- (sum_to_iter α β γ) _ (iter_to_sum α β γ) _ ,
1410
+ (sum_to_iter α β γ) (iter_to_sum α β γ),
1419
1411
{ assume p,
1420
- apply hom_eq_hom _ _ _ _ _ _ p,
1421
- apply_instance,
1422
- { apply @is_semiring_hom.comp _ _ _ _ _ _ _ _ _ _,
1423
- apply_instance,
1424
- apply @is_semiring_hom.comp _ _ _ _ _ _ _ _ _ _,
1425
- apply_instance,
1426
- { apply_instance, },
1427
- { apply mv_polynomial.is_semiring_hom_iter_to_sum α β γ },
1428
- { apply mv_polynomial.is_semiring_hom_sum_to_iter α β γ } },
1429
- { apply_instance, },
1430
- { assume a, rw [iter_to_sum_C_C α β γ, sum_to_iter_C α β γ] },
1431
- { assume c, rw [iter_to_sum_C_X α β γ, sum_to_iter_Xr α β γ] } },
1412
+ convert hom_eq_hom ((sum_to_iter α β γ).comp ((iter_to_sum α β γ).comp C)) C _ _ p,
1413
+ { assume a, dsimp, rw [iter_to_sum_C_C α β γ, sum_to_iter_C α β γ] },
1414
+ { assume c, dsimp, rw [iter_to_sum_C_X α β γ, sum_to_iter_Xr α β γ] } },
1432
1415
{ assume b, rw [iter_to_sum_X α β γ, sum_to_iter_Xl α β γ] },
1433
1416
{ assume a, rw [sum_to_iter_C α β γ, iter_to_sum_C_C α β γ] },
1434
1417
{ assume n, cases n with b c,
1435
1418
{ rw [sum_to_iter_Xl, iter_to_sum_X] },
1436
1419
{ rw [sum_to_iter_Xr, iter_to_sum_C_X] } },
1437
- { apply mv_polynomial.is_semiring_hom_sum_to_iter α β γ },
1438
- { apply mv_polynomial.is_semiring_hom_iter_to_sum α β γ }
1439
1420
end
1440
1421
1441
1422
/--
0 commit comments