@@ -84,7 +84,7 @@ From mathcomp Require Import order fingroup perm ssralg zmodp poly ssrint.
8484From mathcomp Require Import matrix vector.
8585From mathcomp Require Import bigenough.
8686
87- Require Import ssrcomplements freeg .
87+ Require Import xfinmap monalg .
8888
8989Set Implicit Arguments .
9090Unset Strict Implicit .
@@ -94,12 +94,6 @@ Import Order.Theory GRing.Theory BigEnough.
9494
9595Local Open Scope ring_scope.
9696
97- Declare Scope mpoly_scope.
98- Declare Scope multi_scope.
99-
100- Delimit Scope mpoly_scope with MP.
101- Delimit Scope multi_scope with MM.
102-
10397Local Notation simpm := Monoid.simpm.
10498
10599Local Infix "@@" := (allpairs pair) (at level 60, right associativity).
@@ -111,14 +105,12 @@ Import Order.DefaultSeqLexiOrder.
111105Import Order.DefaultTupleLexiOrder.
112106
113107(* -------------------------------------------------------------------- *)
114- Reserved Notation "''X_{1..' n '}'" (n at level 2).
115108Reserved Notation "''X_{1..' n < b '}'" (n, b at level 2).
116109Reserved Notation "''X_{1..' n < b1 , b2 '}'" (b1, b2 at level 2).
117110Reserved Notation "[ 'multinom' s ]" (format "[ 'multinom' s ]").
118111Reserved Notation "[ 'multinom' 'of' s ]" (format "[ 'multinom' 'of' s ]").
119112Reserved Notation "[ 'multinom' F | i < n ]"
120- (i at level 0,
121- format "[ '[hv' 'multinom' F '/' | i < n ] ']'").
113+ (i at level 0, format "[ '[hv' 'multinom' F '/' | i < n ] ']'").
122114Reserved Notation "'U_(' n )" (format "'U_(' n )").
123115Reserved Notation "{ 'mpoly' T [ n ] }"
124116 (T at level 2, format "{ 'mpoly' T [ n ] }").
@@ -127,8 +119,7 @@ Reserved Notation "{ 'ipoly' T [ n ] }"
127119 (T at level 2, format "{ 'ipoly' T [ n ] }").
128120Reserved Notation "{ 'ipoly' T [ n ] }^p"
129121 (T at level 2, format "{ 'ipoly' T [ n ] }^p").
130- Reserved Notation "''X_' i"
131- (at level 8, i at level 2, format "''X_' i").
122+ Reserved Notation "''X_' i" (at level 8, i at level 2, format "''X_' i").
132123Reserved Notation "''X_[' i ]" (format "''X_[' i ]").
133124Reserved Notation "''X_[' R , i ]" (format "''X_[' R , i ]").
134125Reserved Notation "c %:MP" (format "c %:MP").
@@ -141,218 +132,157 @@ Reserved Notation "e .@[< x >]" (format "e .@[< x >]").
141132Reserved Notation "p \mPo q" (at level 50).
142133Reserved Notation "x ^[ f ]" (format "x ^[ f ]").
143134Reserved Notation "x ^[ f , g ]" (format "x ^[ f , g ]").
144- Reserved Notation "p ^`M ( m )"
145- (at level 8, format "p ^`M ( m )").
146- Reserved Notation "p ^`M ( m , n )"
147- (at level 8, format "p ^`M ( m , n )").
148- Reserved Notation "p ^`M [ m ]"
149- (at level 8, format "p ^`M [ m ]").
150- Reserved Notation "''s_' k"
151- (at level 8, k at level 2, format "''s_' k").
135+ Reserved Notation "p ^`M ( m )" (at level 8, format "p ^`M ( m )").
136+ Reserved Notation "p ^`M ( m , n )" (at level 8, format "p ^`M ( m , n )").
137+ Reserved Notation "p ^`M [ m ]" (at level 8, format "p ^`M [ m ]").
138+ Reserved Notation "''s_' k" (at level 8, k at level 2, format "''s_' k").
152139Reserved Notation "''s_(' n , k )" (format "''s_(' n , k )").
153140Reserved Notation "''s_(' K , n , k )" (format "''s_(' K , n , k )").
154141Reserved Notation "+%MM".
155142Reserved Notation "-%MM".
156143
157144(* -------------------------------------------------------------------- *)
158- Section MultinomDef.
159- Context (n : nat).
160-
161- Record multinom : predArgType := Multinom { multinom_val :> n.-tuple nat }.
162-
163- HB.instance Definition _ := [isNew for multinom_val].
164-
165- Definition fun_of_multinom M := tnth (multinom_val M).
166-
167- Coercion fun_of_multinom : multinom >-> Funclass.
168-
169- Lemma multinomE M : Multinom M =1 tnth M.
170- Proof . by []. Qed .
171-
172- End MultinomDef.
173145
174- Notation "[ 'multinom' s ]" := (@Multinom _ s) : form_scope.
175- Notation "[ 'multinom' 'of' s ]" := [multinom [tuple of s]] : form_scope.
176146Notation "[ 'multinom' E | i < n ]" :=
177- [multinom [tuple E%N | i < n]] : form_scope .
147+ [cmonom E | i in [fset x in 'I_n]]%M : monom_scope .
178148Notation "[ 'multinom' E | i < n ]" :=
179- [multinom [tuple E%N : nat | i < n]] (only parsing) : form_scope .
149+ [cmonom E : nat | i in [fset x in 'I_n]]%M (only parsing) : monom_scope .
180150
181151(* -------------------------------------------------------------------- *)
182- Notation "''X_{1..' n '}'" := (multinom n) : type_scope.
183-
184- HB.instance Definition _ n := [Countable of 'X_{1..n} by <:].
185-
186- Bind Scope multi_scope with multinom.
187-
188- (* -------------------------------------------------------------------- *)
189- Definition lem n (m1 m2 : 'X_{1..n}) :=
190- [forall i, m1%MM i <= m2%MM i].
191-
192- Definition ltm n (m1 m2 : 'X_{1..n}) :=
193- (m1 != m2) && (lem m1 m2).
194-
195- (* -------------------------------------------------------------------- *)
196- Section MultinomTheory.
197- Context {n : nat}.
198- Implicit Types (m : 'X_{1..n}).
152+ #[deprecated(use=mone)]
153+ Notation mnm0 := (@mone 'X_{1.._}).
154+ #[deprecated(use=ucm)]
155+ Notation mnm1 := (@ucm 'I__).
156+ #[deprecated(use=mmul)]
157+ Notation mnm_add := (@mmul 'X_{1.._}).
158+ #[deprecated(use=divcm)]
159+ Notation mnm_sub := (@divcm 'I__).
160+ #[deprecated(use=expmn)]
161+ Notation mnm_muln := (@expmn 'X_{1.._}).
199162
200- Lemma mnm_tnth m j : m j = tnth m j.
201- Proof . by []. Qed .
202-
203- Lemma mnm_nth x0 m j : m j = nth x0 m j.
204- Proof . by rewrite mnm_tnth (tnth_nth x0). Qed .
205-
206- Lemma mnmE E j : [multinom E i | i < n] j = E j.
207- Proof . by rewrite multinomE tnth_mktuple. Qed .
208-
209- Lemma mnm_valK t : [multinom t] = t :> n.-tuple nat.
210- Proof . by []. Qed .
211-
212- Lemma mnmP m1 m2 : (m1 = m2) <-> (m1 =1 m2).
213- Proof .
214- case: m1 m2 => [m1] [m2] /=; split => [->//|h].
215- by apply/val_inj/eq_from_tnth => i; rewrite -!multinomE.
216- Qed .
217-
218- End MultinomTheory.
219-
220- (* -------------------------------------------------------------------- *)
221163Section MultinomMonoid.
222164Context {n : nat}.
223165Implicit Types (m : 'X_{1..n}).
224166
225- Definition mnm0 := [multinom 0 | _ < n ].
226- Definition mnm1 (c : 'I_n) := [multinom c == i | i < n] .
227- Definition mnm_add m1 m2 := [multinom m1 i + m2 i | i < n].
228- Definition mnm_sub m1 m2 := [multinom m1 i - m2 i | i < n] .
229- Definition mnm_muln m i := iterop i mnm_add m mnm0 .
167+ Definition lem m1 m2 := [forall i, m1 i <= m2 i ].
168+ Definition ltm m1 m2 := (m1 != m2) && (lem m1 m2) .
169+
170+ Local Notation "*%M" := (@mmul 'X_{1..n}) : function_scope .
171+ Local Notation "/%M" := (@divcm 'I_n) : function_scope .
230172
231- Arguments mnm_muln : simpl never.
173+ Local Notation "1" := (@mone 'X_{1..n}) : monom_scope.
174+ Local Notation "'U_(' i )" := (@ucm 'I_n i) : monom_scope.
175+ Local Notation "m1 * m2" := ( *%M m1 m2) : monom_scope.
176+ Local Notation "m1 / m2" := (/%M m1 m2) : monom_scope.
177+ Local Notation "x ^+ m" := (@expmn 'X_{1..n} x m) : monom_scope.
232178
233- Local Notation "0" := mnm0 : multi_scope.
234- Local Notation "'U_(' n )" := (mnm1 n) : multi_scope.
235- Local Notation "m1 + m2" := (mnm_add m1 m2) : multi_scope.
236- Local Notation "m1 - m2" := (mnm_sub m1 m2) : multi_scope.
237- Local Notation "x *+ n" := (mnm_muln x n) : multi_scope.
179+ Local Notation "m1 <= m2" := (lem m1 m2) : monom_scope.
180+ Local Notation "m1 < m2" := (ltm m1 m2) : monom_scope.
238181
239- Local Notation "+%MM" := (@mnm_add ) : function_scope .
240- Local Notation "-%MM" := (@mnm_sub) : function_scope .
182+ Lemma mnmE (E : 'I_n -> nat) (j : 'I_n ) : [multinom E i | i < n]%M j = E j .
183+ Proof . by rewrite cmE fsfunE inE. Qed .
241184
242- Local Notation " m1 <= m2" := (lem m1 m2) : multi_scope .
243- Local Notation "m1 < m2" := (ltm m1 m2) : multi_scope .
185+ Lemma mnmP ( m1 m2 : 'X_{1..n}) : ( m1 = m2) <-> (m1 =1 m2) .
186+ Proof . by split => [->|/fsfunP/val_inj]. Qed .
244187
245- Lemma mnm0E i : 0%MM i = 0%N. Proof . exact/mnmE . Qed .
188+ Lemma mnm0E i : 1%M i = 0%N. Proof . exact: cm1 . Qed .
246189
247- Lemma mnmDE i m1 m2 : (m1 + m2)%MM i = (m1 i + m2 i)%N. Proof . exact/mnmE . Qed .
190+ Lemma mnmDE i m1 m2 : (m1 * m2)%M i = (m1 i + m2 i)%N. Proof . exact: cmM . Qed .
248191
249- Lemma mnmBE i m1 m2 : (m1 - m2)%MM i = (m1 i - m2 i)%N. Proof . exact/mnmE. Qed .
192+ Lemma mnmBE i m1 m2 : (m1 / m2)%M i = (m1 i - m2 i)%N.
193+ Proof . exact: divcmE. Qed .
250194
251195Lemma mnm_sumE (I : Type ) i (r : seq I) P F :
252- (\big[+%MM/0%MM]_(x <- r | P x) (F x)) i = (\sum_(x <- r | P x) (F x i))%N.
253- Proof . by apply/(big_morph (fun m => m i)) => [x y|]; rewrite mnmE. Qed .
196+ (\big[*%M/1%M]_(x <- r | P x) (F x)) i = (\sum_(x <- r | P x) (F x i))%N.
197+ Proof . exact/(big_morph (fun m => m i))/cm1/cmM. Qed .
198+
199+ Lemma mnm1E i j : U_(i)%M j = (i == j). Proof . exact: ucmE. Qed .
254200
255201(*-------------------------------------------------------------------- *)
256- Lemma mnm_lepP {m1 m2} : reflect (forall i, m1 i <= m2 i) (m1 <= m2)%MM .
202+ Lemma mnm_lepP {m1 m2} : reflect (forall i, m1 i <= m2 i) (m1 <= m2)%M .
257203Proof . exact: (iffP forallP). Qed .
258204
259- Lemma lepm_refl m : (m <= m)%MM . Proof . exact/mnm_lepP. Qed .
205+ Lemma lepm_refl m : (m <= m)%M . Proof . exact/mnm_lepP. Qed .
260206
261- Lemma lepm_trans m3 m1 m2 : (m1 <= m2 -> m2 <= m3 -> m1 <= m3)%MM .
207+ Lemma lepm_trans m3 m1 m2 : (m1 <= m2 -> m2 <= m3 -> m1 <= m3)%M .
262208Proof .
263209move=> h1 h2; apply/mnm_lepP => i.
264210exact: leq_trans (mnm_lepP h1 i) (mnm_lepP h2 i).
265211Qed .
266212
267- Lemma addmC : commutative +%MM.
268- Proof . by move=> m1 m2; apply/mnmP=> i; rewrite !mnmE addnC. Qed .
269-
270- Lemma addmA : associative +%MM.
271- Proof . by move=> m1 m2 m3; apply/mnmP=> i; rewrite !mnmE addnA. Qed .
213+ Lemma addmC : commutative *%M. Proof . exact: mulmC. Qed .
272214
273- Lemma add0m : left_id 0%MM +%MM.
274- Proof . by move=> m; apply/mnmP=> i; rewrite !mnmE add0n. Qed .
215+ Lemma addmA : associative *%M. Proof . exact: mulmA. Qed .
275216
276- Lemma addm0 : right_id 0%MM +%MM.
277- Proof . by move=> m; rewrite addmC add0m. Qed .
217+ Lemma add0m : left_id 1%M *%M. Proof . exact: mul1m. Qed .
278218
279- HB.instance Definition _ := Monoid.isComLaw.Build 'X_{1..n} 0%MM +%MM
280- addmA addmC add0m.
219+ Lemma addm0 : right_id 1%M *%M. Proof . exact: mulm1. Qed .
281220
282- Lemma subm0 m : (m - 0)%MM = m.
283- Proof . by apply/mnmP=> i; rewrite !mnmE subn0. Qed .
221+ Lemma subm0 m : (m / 1)%M = m.
222+ Proof . by apply/mnmP=> i; rewrite divcmE cm1 subn0. Qed .
284223
285- Lemma sub0m m : (0 - m = 0)%MM .
286- Proof . by apply/mnmP=> i; rewrite !mnmE sub0n. Qed .
224+ Lemma sub0m m : (1 / m = 1)%M .
225+ Proof . by apply/mnmP=> i; rewrite divcmE cm1 sub0n. Qed .
287226
288- Lemma addmK m : cancel (+%MM ^~ m) (-%MM ^~ m).
289- Proof . by move=> m' /= ; apply/mnmP=> i; rewrite !mnmE addnK. Qed .
227+ Lemma addmK m : cancel ( *%M ^~ m) (/%M ^~ m).
228+ Proof . by move=> m'; apply/mnmP=> i; rewrite divcmE cmM addnK. Qed .
290229
291- Lemma addIm : left_injective +%MM .
292- Proof . by move=> ? ? ? /(can_inj (@ addmK _)). Qed .
230+ Lemma addIm : left_injective *%M .
231+ Proof . by move=> ? ? ? /(can_inj (addmK _)). Qed .
293232
294- Lemma addmI : right_injective +%MM .
295- Proof . by move=> m ? ?; rewrite ![(m + _)%MM]addmC => /addIm. Qed .
233+ Lemma addmI : right_injective *%M .
234+ Proof . by move=> m ? ?; rewrite ![mmul m _]mulmC => /addIm. Qed .
296235
297- Lemma eqm_add2l m n1 n2 : (m + n1 == m + n2)%MM = (n1 == n2).
236+ Lemma eqm_add2l m n1 n2 : (m * n1 == m * n2)%M = (n1 == n2).
298237Proof . exact/inj_eq/addmI. Qed .
299238
300- Lemma eqm_add2r m n1 n2 : (n1 + m == n2 + m)%MM = (n1 == n2).
239+ Lemma eqm_add2r m n1 n2 : (n1 * m == n2 * m)%M = (n1 == n2).
301240Proof . exact: (inj_eq (@addIm _)). Qed .
302241
303- Lemma submK m m' : (m <= m')%MM -> (m' - m + m = m')%MM .
304- Proof . by move/mnm_lepP=> h; apply/mnmP=> i; rewrite !mnmE subnK. Qed .
242+ Lemma submK m m' : (m <= m')%M -> (m' / m * m = m')%M .
243+ Proof . by move/mnm_lepP=> h; apply/mnmP=> i; rewrite cmM divcmE subnK. Qed .
305244
306- Lemma addmBA m1 m2 m3 :
307- (m3 <= m2)%MM -> (m1 + (m2 - m3))%MM = (m1 + m2 - m3)%MM.
308- Proof . by move/mnm_lepP=> h; apply/mnmP=> i; rewrite !mnmE addnBA. Qed .
245+ Lemma addmBA m1 m2 m3 : (m3 <= m2)%M -> (m1 * (m2 / m3))%M = (m1 * m2 / m3)%M.
246+ Proof . by move/mnm_lepP=> h; apply/mnmP=> i; rewrite !(divcmE, cmM) addnBA. Qed .
309247
310- Lemma submDA m1 m2 m3 : (m1 - m2 - m3)%MM = (m1 - (m2 + m3))%MM .
311- Proof . by apply/mnmP=> i; rewrite !mnmE subnDA. Qed .
248+ Lemma submDA m1 m2 m3 : (m1 / m2 / m3)%M = (m1 / (m2 * m3))%M .
249+ Proof . by apply/mnmP=> i; rewrite !divcmE cmM subnDA. Qed .
312250
313- Lemma submBA m1 m2 m3 : (m3 <= m2)%MM -> (m1 - (m2 - m3) = m1 + m3 - m2)%MM .
314- Proof . by move/mnm_lepP=> h; apply/mnmP=> i; rewrite !mnmE subnBA. Qed .
251+ Lemma submBA m1 m2 m3 : (m3 <= m2)%M -> (m1 / (m2 / m3) = m1 * m3 / m2)%M .
252+ Proof . by move/mnm_lepP=> h; apply/mnmP=> i; rewrite !divcmE cmM subnBA. Qed .
315253
316- Lemma lem_subr m1 m2 : (m1 - m2 <= m1)%MM .
317- Proof . by apply/mnm_lepP=> i; rewrite !mnmE leq_subr. Qed .
254+ Lemma lem_subr m1 m2 : (m1 / m2 <= m1)%M .
255+ Proof . by apply/mnm_lepP=> i; rewrite divcmE leq_subr. Qed .
318256
319- Lemma lem_addr m1 m2 : (m1 <= m1 + m2)%MM .
320- Proof . by apply/mnm_lepP=> i; rewrite mnmDE leq_addr. Qed .
257+ Lemma lem_addr m1 m2 : (m1 <= m1* m2)%M .
258+ Proof . by apply/mnm_lepP=> i; rewrite cmM leq_addr. Qed .
321259
322- Lemma lem_addl m1 m2 : (m2 <= m1 + m2)%MM .
323- Proof . by apply/mnm_lepP=> i; rewrite mnmDE leq_addl. Qed .
260+ Lemma lem_addl m1 m2 : (m2 <= m1 * m2)%M .
261+ Proof . by apply/mnm_lepP=> i; rewrite cmM leq_addl. Qed .
324262
325263(* -------------------------------------------------------------------- *)
326- Lemma mulm0n m : (m *+ 0 = 0)%MM.
327- Proof . by []. Qed .
264+ Lemma mulm0n m : (m ^+ 0 = 1)%M. Proof . by []. Qed .
328265
329- Lemma mulm1n m : (m *+ 1 = m)%MM.
330- Proof . by []. Qed .
266+ Lemma mulm1n m : (m ^+ 1 = m)%M. Proof . by []. Qed .
331267
332- Lemma mulmS m i : (m *+ i.+1 = m + m *+ i)%MM.
333- Proof . by rewrite /mnm_muln !Monoid.iteropE iterS. Qed .
268+ Lemma mulmS m i : (m ^+ i.+1 = m * m ^+ i)%M. Proof . exact: expmnS. Qed .
334269
335- Lemma mulmSr m i : (m *+ i.+1 = m *+ i + m)%MM.
336- Proof . by rewrite mulmS addmC. Qed .
270+ Lemma mulmSr m i : (m ^+ i.+1 = m ^+ i * m)%M. Proof . exact: expmnSr. Qed .
337271
338- Lemma mulmnE m k i : ((m * + k) i)%MM = (m i * k)%N.
272+ Lemma mulmnE m k i : (m ^ + k)%M i = (m i * k)%N.
339273Proof .
340- elim: k => [|k ih]; first by rewrite muln0 mulm0n !mnmE .
341- by rewrite mulmS mulnS mnmDE ih .
274+ elim: k => [|k ih]; first by rewrite cm1 muln0 .
275+ by rewrite mulmS cmM ih mulnS .
342276Qed .
343277
344- Lemma mnm1E i j : U_(i)%MM j = (i == j). Proof . exact/mnmE. Qed .
345-
346- Lemma lep1mP i m : (U_(i) <= m)%MM = (m i != 0%N).
278+ Lemma lep1mP i m : (U_(i) <= m)%M = (m i != 0%N).
347279Proof .
348280apply/mnm_lepP/idP=> [/(_ i)|]; rewrite -lt0n; first by rewrite mnm1E eqxx.
349281by move=> lt0_mi j; rewrite mnm1E; case: eqP=> // <-.
350282Qed .
351283
352284End MultinomMonoid.
353285
354- Arguments mnm_muln : simpl never.
355-
356286(* -------------------------------------------------------------------- *)
357287Notation "+%MM" := (@mnm_add _).
358288Notation "-%MM" := (@mnm_sub _).
0 commit comments