|
44 | 44 | (* using Emn : m = n *)
|
45 | 45 | (* mwiden p == the canonical injection (ring morphism) from *)
|
46 | 46 | (* {mpoly R[n]} to {mpoly R[n.+1]} *)
|
| 47 | +(* mrshift m p == the injection (ring morphism) from {mpoly R[n]} *) |
| 48 | +(* to {mpoly R[m+n]} that maps each 'X_i to 'X_(i+m) *) |
47 | 49 | (* mpolyC c, c%:MP == the constant multivariate polynomial c *)
|
48 | 50 | (* 'X_i == the variable i, for i : 'I_n *)
|
49 | 51 | (* 'X_[m] == the monomial m as a multivariate polynomial *)
|
@@ -4070,6 +4072,203 @@ Proof. by rewrite /mpwiden map_polyZ. Qed.
|
4070 | 4072 |
|
4071 | 4073 | End MWiden.
|
4072 | 4074 |
|
| 4075 | +(* -------------------------------------------------------------------- *) |
| 4076 | +Section MRshift. |
| 4077 | +Context {R : ringType} {n : nat}. |
| 4078 | + |
| 4079 | +Definition mrshift (m : nat) (p : {mpoly R[n]}) : {mpoly R[m + n]} := |
| 4080 | + mmap (@mpolyC _ _) (fun i => 'X_(rshift m i)) p. |
| 4081 | + |
| 4082 | +Definition mnmrshift (m : nat) (mn : 'X_{1..n}) : 'X_{1..m + n} := |
| 4083 | + [multinom of nseq m 0%N ++ mn]. |
| 4084 | + |
| 4085 | +Lemma mnmrshift_l m mn (i : 'I_m) : mnmrshift m mn (lshift n i) = 0%N. |
| 4086 | +Proof. |
| 4087 | +by case: mn => mn; rewrite (mnm_nth 0%N)/= nth_cat size_nseq nth_nseq ltn_ord. |
| 4088 | +Qed. |
| 4089 | + |
| 4090 | +Lemma mnmrshift_r m mn (i : 'I_n) : mnmrshift m mn (rshift m i) = mn i. |
| 4091 | +Proof. |
| 4092 | +case: mn => mn; rewrite !(mnm_nth 0%N)/=. |
| 4093 | +by rewrite nth_cat size_nseq ltnNge leq_addr addKn. |
| 4094 | +Qed. |
| 4095 | + |
| 4096 | +Lemma mnmrshift0 m : mnmrshift m 0 = 0%MM. |
| 4097 | +Proof. |
| 4098 | +apply/mnmP => i; rewrite mnmE (mnm_nth 0%N)/= nth_cat size_nseq. |
| 4099 | +case: ltnP => im; first by rewrite nth_nseq; case: ifP. |
| 4100 | +case: n i im => [|n'] i im; first by rewrite enum_ord0 nth_nil. |
| 4101 | +by rewrite (nth_map 0)// size_enum_ord ltn_psubLR. |
| 4102 | +Qed. |
| 4103 | + |
| 4104 | +Lemma mnmrshiftD m mn1 mn2 : |
| 4105 | + mnmrshift m (mn1 + mn2) = (mnmrshift m mn1 + mnmrshift m mn2)%MM. |
| 4106 | +Proof. |
| 4107 | +apply/mnmP => i; rewrite mnmDE !multinomE !(tnth_nth 0%N) !nth_cat size_nseq /=. |
| 4108 | +case: ltnP => im; first by rewrite nth_nseq im. |
| 4109 | +case: n mn1 mn2 i im => [|n'] mn1 mn2 i im. |
| 4110 | + by rewrite enum_ord0 tuple0 !nth_nil tuple0 nth_nil. |
| 4111 | +have imn' : (i - m < n'.+1)%N by rewrite ltn_psubLR. |
| 4112 | +by rewrite (nth_map 0) ?mnm_tnth ?(tnth_nth 0%N) ?nth_enum_ord ?size_enum_ord. |
| 4113 | +Qed. |
| 4114 | + |
| 4115 | +Lemma mnmrshift_sum m (I : Type) (r : seq I) P F : |
| 4116 | + mnmrshift m (\sum_(x <- r | P x) (F x)) |
| 4117 | + = (\sum_(x <- r | P x) (mnmrshift m (F x)))%MM. |
| 4118 | +Proof. exact/big_morph/mnmrshift0/mnmrshiftD. Qed. |
| 4119 | + |
| 4120 | +Lemma mnmrshift1 m i : (mnmrshift m U_(i) = U_(rshift m i))%MM. |
| 4121 | +Proof. |
| 4122 | +apply/mnmP => j; rewrite /mnmrshift !mnmE multinomE (tnth_nth 0%N)/=. |
| 4123 | +rewrite nth_cat size_nseq; case: ltnP => jm; apply/esym/eqP. |
| 4124 | + by rewrite nth_nseq jm eqb0; apply: contra_ltnN jm => /eqP<-; apply: leq_addr. |
| 4125 | +case: n i j jm => [[]//|n'] i j jm; rewrite (nth_map 0); last first. |
| 4126 | + by rewrite ltn_subLR// size_enum_ord ltn_ord. |
| 4127 | +apply/eqP; congr (nat_of_bool _); apply/eqP/eqP. |
| 4128 | +- by move=> <-; rewrite addKn nth_ord_enum. |
| 4129 | +- move=> ->; apply/val_inj; rewrite /= nth_enum_ord ?subnKC//. |
| 4130 | + by rewrite ltn_subLR ?ltn_ord. |
| 4131 | +Qed. |
| 4132 | + |
| 4133 | +Lemma inj_mnmrshift m : injective (mnmrshift m). |
| 4134 | +Proof. |
| 4135 | +move=> m1 m2 /mnmP h; apply/mnmP => i. |
| 4136 | +by move: (h (rshift m i)); rewrite !mnmrshift_r. |
| 4137 | +Qed. |
| 4138 | + |
| 4139 | +Lemma mrshift0n (p : {mpoly R[n]}) : mrshift 0 p = p. |
| 4140 | +Proof. |
| 4141 | +rewrite [RHS]mpolyE; apply: eq_bigr => m _. |
| 4142 | +by rewrite mul_mpolyC; congr (_ *: _); rewrite mpolyXE_id. |
| 4143 | +Qed. |
| 4144 | + |
| 4145 | +Lemma mrshift_is_additive m : additive (mrshift m). |
| 4146 | +Proof. exact/mmap_is_additive. Qed. |
| 4147 | + |
| 4148 | +Lemma mrshift0 m : mrshift m 0 = 0. Proof. exact: raddf0. Qed. |
| 4149 | +Lemma mrshiftN m : {morph mrshift m: x / - x}. Proof. exact: raddfN. Qed. |
| 4150 | +Lemma mrshiftD m : {morph mrshift m: x y / x + y}. Proof. exact: raddfD. Qed. |
| 4151 | +Lemma mrshiftB m : {morph mrshift m: x y / x - y}. Proof. exact: raddfB. Qed. |
| 4152 | +Lemma mrshiftMn m k : {morph mrshift m: x / x *+ k}. Proof. exact: raddfMn. Qed. |
| 4153 | +Lemma mrshiftMNn m k : {morph mrshift m: x / x *- k}. |
| 4154 | +Proof. exact: raddfMNn. Qed. |
| 4155 | + |
| 4156 | +HB.instance Definition _ m := |
| 4157 | + GRing.isAdditive.Build {mpoly R[n]} {mpoly R[m + n]} (mrshift m) |
| 4158 | + (mrshift_is_additive m). |
| 4159 | + |
| 4160 | +Lemma mrshift_is_multiplicative m : multiplicative (mrshift m). |
| 4161 | +Proof. |
| 4162 | +apply/commr_mmap_is_multiplicative=> [i p|p mn mn']; first exact/commr_mpolyX. |
| 4163 | +rewrite /= /mmap1; elim/big_rec: _ => /= [|i q _]; first exact/commr1. |
| 4164 | +exact/commrM/commrX/commr_mpolyX. |
| 4165 | +Qed. |
| 4166 | + |
| 4167 | +HB.instance Definition _ m := |
| 4168 | + GRing.isMultiplicative.Build {mpoly R[n]} {mpoly R[m + n]} (mrshift m) |
| 4169 | + (mrshift_is_multiplicative m). |
| 4170 | + |
| 4171 | +Lemma mrshift1 m : mrshift m 1 = 1. |
| 4172 | +Proof. exact: rmorph1. Qed. |
| 4173 | + |
| 4174 | +Lemma mrshiftM m : {morph mrshift m: x y / x * y}. |
| 4175 | +Proof. exact: rmorphM. Qed. |
| 4176 | + |
| 4177 | +Lemma mrshiftC m c : mrshift m c%:MP = c%:MP. |
| 4178 | +Proof. by rewrite /mrshift mmapC. Qed. |
| 4179 | + |
| 4180 | +Lemma mrshiftN1 m : mrshift m (-1) = -1. |
| 4181 | +Proof. by rewrite raddfN /= mrshiftC. Qed. |
| 4182 | + |
| 4183 | +Lemma mrshiftX m mn : mrshift m 'X_[mn] = 'X_[mnmrshift m mn]. |
| 4184 | +Proof. |
| 4185 | +rewrite /mrshift mmapX /mmap1 /= (mpolyXE _ 1); apply/esym. |
| 4186 | +rewrite (eq_bigr (fun i => 'X_i ^+ (mnmrshift m mn i))); last first. |
| 4187 | + by move=> i _; rewrite perm1. |
| 4188 | +rewrite big_split_ord/=; under eq_bigr => i _ do rewrite mnmrshift_l expr0. |
| 4189 | +by rewrite prodr_const expr1n mul1r; apply: eq_bigr => i _; rewrite mnmrshift_r. |
| 4190 | +Qed. |
| 4191 | + |
| 4192 | +Lemma mrshiftZ m c p : mrshift m (c *: p) = c *: mrshift m p. |
| 4193 | +Proof. by rewrite /mrshift mmapZ /= mul_mpolyC. Qed. |
| 4194 | + |
| 4195 | +Lemma mrshiftE m (p : {mpoly R[n]}) (k : nat) : msize p <= k -> |
| 4196 | + mrshift m p = \sum_(mn : 'X_{1..n < k}) (p@_mn *: 'X_[mnmrshift m mn]). |
| 4197 | +Proof. |
| 4198 | +move=> h; rewrite {1}[p](mpolywE (k := k)) //. |
| 4199 | +rewrite raddf_sum /=; apply/eq_bigr => mn _. |
| 4200 | +by rewrite mrshiftZ mrshiftX. |
| 4201 | +Qed. |
| 4202 | + |
| 4203 | +Lemma mrshift_mnmrshift m p mn : (mrshift m p)@_(mnmrshift m mn) = p@_mn. |
| 4204 | +Proof. |
| 4205 | +rewrite (mrshiftE m (k := msize p)) // raddf_sum /=. |
| 4206 | +rewrite [X in _=X@__](mpolywE (k := msize p)) //. |
| 4207 | +rewrite raddf_sum /=; apply/eq_bigr=> i _. |
| 4208 | +by rewrite !mcoeffZ !mcoeffX inj_eq //; apply/inj_mnmrshift. |
| 4209 | +Qed. |
| 4210 | + |
| 4211 | +Lemma inj_mrshift m : injective (mrshift m). |
| 4212 | +Proof. |
| 4213 | +move=> m1 m2 /mpolyP h; apply/mpolyP => mn. |
| 4214 | +by move: (h (mnmrshift m mn)); rewrite !mrshift_mnmrshift. |
| 4215 | +Qed. |
| 4216 | + |
| 4217 | +Definition mprshift m (p : {poly {mpoly R[n]}}) : {poly {mpoly R[m + n]}} := |
| 4218 | + map_poly (mrshift m) p. |
| 4219 | + |
| 4220 | +Lemma mprshift_is_additive m : additive (mprshift m). |
| 4221 | +Proof. exact: map_poly_is_additive. Qed. |
| 4222 | + |
| 4223 | +HB.instance Definition _ m := |
| 4224 | + GRing.isAdditive.Build {poly {mpoly R[n]}} {poly {mpoly R[m + n]}} |
| 4225 | + (mprshift m) (mprshift_is_additive m). |
| 4226 | + |
| 4227 | +Lemma mprshift_is_multiplicative m : multiplicative (mprshift m). |
| 4228 | +Proof. exact: map_poly_is_multiplicative. Qed. |
| 4229 | + |
| 4230 | +HB.instance Definition _ m := |
| 4231 | + GRing.isMultiplicative.Build {poly {mpoly R[n]}} {poly {mpoly R[m + n]}} |
| 4232 | + (mprshift m) (mprshift_is_multiplicative m). |
| 4233 | + |
| 4234 | +Lemma mprshiftX m : mprshift m 'X = 'X. |
| 4235 | +Proof. by rewrite /mprshift map_polyX. Qed. |
| 4236 | + |
| 4237 | +Lemma mprshiftC m c : mprshift m c%:P = (mrshift m c)%:P. |
| 4238 | +Proof. by rewrite /mprshift map_polyC. Qed. |
| 4239 | + |
| 4240 | +Lemma mprshiftZ m c p : mprshift m (c *: p) = mrshift m c *: (mprshift m p). |
| 4241 | +Proof. by rewrite /mprshift map_polyZ. Qed. |
| 4242 | + |
| 4243 | +End MRshift. |
| 4244 | + |
| 4245 | +Lemma mnmrshiftDn {m n n'} (mn : 'X_{1..m}) : mnmrshift (n + n') mn |
| 4246 | + = mnmcast (addnA n n' m) (mnmrshift n (mnmrshift n' mn)). |
| 4247 | +Proof. |
| 4248 | +apply/mnmP => i; rewrite mnmcastE. |
| 4249 | +case: (split_ordP i) => {}i ->; last first. |
| 4250 | + by rewrite mnmrshift_r rshiftDn cast_ord_comp cast_ord_id !mnmrshift_r. |
| 4251 | +rewrite mnmrshift_l; case: (split_ordP i) => {}i ->; last first. |
| 4252 | + by rewrite lshift_rshift cast_ord_comp cast_ord_id mnmrshift_r mnmrshift_l. |
| 4253 | +by rewrite -lshiftDn mnmrshift_l. |
| 4254 | +Qed. |
| 4255 | + |
| 4256 | +Lemma mrshiftDn {R m n n'} (p : {mpoly R[m]}) : |
| 4257 | + mrshift (n + n') p = mpcast (addnA _ _ _) (mrshift n (mrshift n' p)). |
| 4258 | +Proof. |
| 4259 | +rewrite [p]mpolyE rmorph_sum/= !(rmorph_sum (mrshift n'))/=. |
| 4260 | +rewrite (rmorph_sum (mrshift n)) (rmorph_sum (mpcast _))/=. |
| 4261 | +apply: eq_bigr => mn _; rewrite !mrshiftZ !mrshiftX mpcastZ mpcastX. |
| 4262 | +by rewrite mnmrshiftDn. |
| 4263 | +Qed. |
| 4264 | + |
| 4265 | +Lemma mpcast_mrshiftDn {R m n1 n2 n3} |
| 4266 | + (eq_n' : n1 + (n2 + m) = n3) (eq_n : n1 + n2 + m = n3) (p : {mpoly R[m]}) : |
| 4267 | + mpcast eq_n (mrshift (n1 + n2) p) = mpcast eq_n' (mrshift n1 (mrshift n2 p)). |
| 4268 | +Proof. |
| 4269 | +by rewrite mrshiftDn mpcast_comp [etrans _ _](nat_irrelevance _ eq_n'). |
| 4270 | +Qed. |
| 4271 | + |
4073 | 4272 | (* -------------------------------------------------------------------- *)
|
4074 | 4273 | Section MPolyUni.
|
4075 | 4274 | Context (n : nat) (R : ringType).
|
|
0 commit comments