|
40 | 40 | (* {ipoly R[n]} == the type obtained by iterating the univariate *) |
41 | 41 | (* polynomial type, with R as base ring. *) |
42 | 42 | (* {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 *) |
43 | 45 | (* mwiden p == the canonical injection (ring morphism) from *) |
44 | 46 | (* {mpoly R[n]} to {mpoly R[n.+1]} *) |
45 | 47 | (* mpolyC c, c%:MP == the constant multivariate polynomial c *) |
@@ -3824,6 +3826,91 @@ End MElemPolySym. |
3824 | 3826 | Local Notation "''s_(' K , n , k )" := (@mesym n K k). |
3825 | 3827 | Local Notation "''s_(' n , k )" := (@mesym n _ k). |
3826 | 3828 |
|
| 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 : nzRingType} {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 | + |
3827 | 3914 | (* -------------------------------------------------------------------- *) |
3828 | 3915 | Section MWiden. |
3829 | 3916 | Context (n : nat) (R : ringType). |
|
0 commit comments