Skip to content

Commit a3a7452

Browse files
committed
Add mpcast
1 parent 883ecef commit a3a7452

1 file changed

Lines changed: 87 additions & 0 deletions

File tree

src/mpoly.v

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
(* {ipoly R[n]} == the type obtained by iterating the univariate *)
4141
(* polynomial type, with R as base ring. *)
4242
(* {ipoly R[n]}^p == copy of {ipoly R[n]} with a ring canonical structure *)
43+
(* mpcast Emn p == the {mpoly R[m]} p cast as a {mpoly R[n]} *)
44+
(* using Emn : m = n *)
4345
(* mwiden p == the canonical injection (ring morphism) from *)
4446
(* {mpoly R[n]} to {mpoly R[n.+1]} *)
4547
(* mpolyC c, c%:MP == the constant multivariate polynomial c *)
@@ -3824,6 +3826,91 @@ End MElemPolySym.
38243826
Local Notation "''s_(' K , n , k )" := (@mesym n K k).
38253827
Local Notation "''s_(' n , k )" := (@mesym n _ k).
38263828

3829+
(* -------------------------------------------------------------------- *)
3830+
Section MPCast.
3831+
3832+
Definition mnmcast {m n} (eq_mn : m = n) (mn : 'X_{1..m}) : 'X_{1..n} :=
3833+
let: erefl in _ = n := eq_mn return 'X_{1..n} in mn.
3834+
3835+
Lemma mnmcast_id {n} (eq_n : n = n) (m : 'X_{1..n}) : mnmcast eq_n m = m.
3836+
Proof. by rewrite eq_axiomK. Qed.
3837+
3838+
Lemma mnmcast_eq0 {m n} (eq_mn : m = n) mn :
3839+
(mnmcast eq_mn mn == 0%MM) = (mn == 0%MM).
3840+
Proof. by move: eq_mn mn => /[dup]-> eq_mn mn; rewrite mnmcast_id. Qed.
3841+
3842+
Definition mpcast {R m n} (eq_mn : m = n) (p : {mpoly R[m]}) : {mpoly R[n]} :=
3843+
let: erefl in _ = n := eq_mn return {mpoly R[n]} in p.
3844+
3845+
Lemma mpcast_id {R n} (eq_n : n = n) (p : {mpoly R[n]}) : mpcast eq_n p = p.
3846+
Proof. by rewrite eq_axiomK. Qed.
3847+
3848+
Lemma mpcast_comp {R n1 n2 n3} (eq_n2 : n1 = n2) (eq_n3 : n2 = n3)
3849+
(p : {mpoly R[n1]}) :
3850+
mpcast eq_n3 (mpcast eq_n2 p) = mpcast (etrans eq_n2 eq_n3) p.
3851+
Proof.
3852+
by move: eq_n3 eq_n2 => /[dup]-> /[swap]/[dup]<- eq eq'; rewrite !mpcast_id.
3853+
Qed.
3854+
3855+
Lemma mpcastE {R m n} (eq_mn : m = n) (p : {mpoly R[m]}) (mn : 'X_{1..n}) :
3856+
(mpcast eq_mn p)@_mn = p@_(mnmcast (esym eq_mn) mn).
3857+
Proof. by move: eq_mn p mn => /[dup]-> ? ? ?; rewrite mpcast_id mnmcast_id. Qed.
3858+
3859+
Lemma mpcastC {R : ringType} {m n} (eq_mn : m = n) (c : R) :
3860+
mpcast eq_mn c%:MP = c%:MP.
3861+
Proof. by apply/mpolyP => mn; rewrite mpcastE !mcoeffC mnmcast_eq0. Qed.
3862+
3863+
Fact mpcast_is_additive {R m n} (eq_mn : m = n) : additive (@mpcast R m n eq_mn).
3864+
Proof. by move=> p q; apply/mpolyP => mn; rewrite mcoeffB !mpcastE mcoeffB. Qed.
3865+
3866+
HB.instance Definition _ R m n (eq_mn : m = n) :=
3867+
GRing.isAdditive.Build {mpoly R[m]} {mpoly R[n]}
3868+
(mpcast eq_mn) (mpcast_is_additive eq_mn).
3869+
3870+
Lemma mpcast0 {R m n} eq_mn : @mpcast R m n eq_mn 0 = 0.
3871+
Proof. exact: raddf0. Qed.
3872+
Lemma mpcastN {R m n} eq_mn : {morph @mpcast R m n eq_mn : p / - p}.
3873+
Proof. exact: raddfN. Qed.
3874+
Lemma mpcastD {R m n} eq_mn : {morph @mpcast R m n eq_mn : p q / p + q}.
3875+
Proof. exact: raddfD. Qed.
3876+
Lemma mpcastB {R m n} eq_mn : {morph @mpcast R m n eq_mn : p q / p - q}.
3877+
Proof. exact: raddfB. Qed.
3878+
Lemma mpcastMn {R m n} eq_mn k : {morph @mpcast R m n eq_mn : p / p *+ k}.
3879+
Proof. exact: raddfMn. Qed.
3880+
Lemma mpcastMNn {R m n} eq_mn k : {morph @mpcast R m n eq_mn : p / p *- k}.
3881+
Proof. exact: raddfMNn. Qed.
3882+
3883+
Fact mpcast_is_multiplicative {R m n} (eq_mn : m = n) :
3884+
multiplicative (@mpcast R m n eq_mn).
3885+
Proof.
3886+
by (split; move: (eq_mn); rewrite eq_mn) => [? p q | ?]; rewrite !mpcast_id.
3887+
Qed.
3888+
3889+
HB.instance Definition _ R m n (eq_mn : m = n) :=
3890+
GRing.isMultiplicative.Build {mpoly R[m]} {mpoly R[n]}
3891+
(mpcast eq_mn) (mpcast_is_multiplicative eq_mn).
3892+
3893+
Lemma mpcast1 {R m n} (eq_mn : m = n) : mpcast eq_mn 1 = 1 :> {mpoly R[n]}.
3894+
Proof. exact: rmorph1. Qed.
3895+
Lemma mpcastM {R m n} eq_mn : {morph @mpcast R m n eq_mn : p q / p * q}.
3896+
Proof. exact: rmorphM. Qed.
3897+
Lemma mpcastXn {R m n} eq_mn k : {morph @mpcast R m n eq_mn : p / p ^+ k}.
3898+
Proof. exact: rmorphXn. Qed.
3899+
3900+
Lemma mpcastZ {R m n} (eq_mn : m = n) c :
3901+
{morph @mpcast R m n eq_mn : p / c *: p}.
3902+
Proof. by move: eq_mn => /[dup]-> eq_mn p; rewrite !mpcast_id. Qed.
3903+
3904+
Lemma mpcastX {R m n} (eq_mn : m = n) mn:
3905+
mpcast eq_mn 'X_[R, mn] = 'X_[mnmcast eq_mn mn].
3906+
Proof. by move: eq_mn mn => /[dup]-> eq_mn mn; rewrite !eq_axiomK. Qed.
3907+
3908+
Lemma mnmcastE {m n} (eq_mn : m = n) (mn : 'X_{1..m}) i :
3909+
mnmcast eq_mn mn i = mn (cast_ord (esym eq_mn) i).
3910+
Proof. by move: eq_mn i => /[dup]<-eq_mn i; rewrite mnmcast_id cast_ord_id. Qed.
3911+
3912+
End MPCast.
3913+
38273914
(* -------------------------------------------------------------------- *)
38283915
Section MWiden.
38293916
Context (n : nat) (R : ringType).

0 commit comments

Comments
 (0)