@@ -8,6 +8,9 @@ Multivariate Polynomial
8
8
import algebra.ring
9
9
import data.finsupp data.polynomial data.equiv.algebra
10
10
11
+ noncomputable theory
12
+ local attribute [instance, priority 100 ] classical.prop_decidable
13
+
11
14
open set function finsupp lattice
12
15
13
16
universes u v w x
@@ -20,12 +23,10 @@ def mv_polynomial (σ : Type*) (α : Type*) [comm_semiring α] := (σ →₀ ℕ
20
23
namespace mv_polynomial
21
24
variables {σ : Type *} {a a' a₁ a₂ : α} {e : ℕ} {n m : σ} {s : σ →₀ ℕ}
22
25
23
- variables [decidable_eq σ] [decidable_eq α]
24
-
25
26
section comm_semiring
26
27
variables [comm_semiring α] {p q : mv_polynomial σ α}
27
28
28
- instance : decidable_eq (mv_polynomial σ α) := finsupp.decidable_eq
29
+ instance decidable_eq_mv_polynomial [decidable_eq σ] [decidable_eq α] : decidable_eq (mv_polynomial σ α) := finsupp.decidable_eq
29
30
instance : has_zero (mv_polynomial σ α) := finsupp.has_zero
30
31
instance : has_one (mv_polynomial σ α) := finsupp.has_one
31
32
instance : has_add (mv_polynomial σ α) := finsupp.has_add
@@ -80,21 +81,21 @@ by rw [X_pow_eq_single, monomial, monomial, monomial, single_mul_single]; simp
80
81
81
82
lemma monomial_eq : monomial s a = C a * (s.prod $ λn e, X n ^ e : mv_polynomial σ α) :=
82
83
begin
83
- apply @finsupp.induction σ ℕ _ _ _ _ s,
84
+ apply @finsupp.induction σ ℕ _ _ s,
84
85
{ simp [C, prod_zero_index]; exact (mul_one _).symm },
85
86
{ assume n e s hns he ih,
86
87
simp [prod_add_index, prod_single_index, pow_zero, pow_add, (mul_assoc _ _ _).symm, ih.symm,
87
88
monomial_add_single] }
88
89
end
89
90
90
- @[recursor 7 ]
91
+ @[recursor 5 ]
91
92
lemma induction_on {M : mv_polynomial σ α → Prop } (p : mv_polynomial σ α)
92
93
(h_C : ∀a, M (C a)) (h_add : ∀p q, M p → M q → M (p + q)) (h_X : ∀p n, M p → M (p * X n)) :
93
94
M p :=
94
95
have ∀s a, M (monomial s a),
95
96
begin
96
97
assume s a,
97
- apply @finsupp.induction σ ℕ _ _ _ _ s,
98
+ apply @finsupp.induction σ ℕ _ _ s,
98
99
{ show M (monomial 0 a), from h_C a, },
99
100
{ assume n e p hpn he ih,
100
101
have : ∀e:ℕ, M (monomial p a * X n ^ e),
@@ -142,7 +143,8 @@ lemma ext_iff (p q : mv_polynomial σ α) :
142
143
@[simp] lemma coeff_zero (m : σ →₀ ℕ) :
143
144
coeff m (0 : mv_polynomial σ α) = 0 := rfl
144
145
145
- @[simp] lemma coeff_zero_X (i : σ) : coeff 0 (X i : mv_polynomial σ α) = 0 := rfl
146
+ @[simp] lemma coeff_zero_X (i : σ) : coeff 0 (X i : mv_polynomial σ α) = 0 :=
147
+ single_eq_of_ne (λ h, by cases single_eq_zero.1 h)
146
148
147
149
instance coeff.is_add_monoid_hom (m : σ →₀ ℕ) :
148
150
is_add_monoid_hom (coeff m : mv_polynomial σ α → α) :=
@@ -158,17 +160,17 @@ by simp [monomial_eq]
158
160
159
161
@[simp] lemma coeff_monomial (m n) (a) :
160
162
coeff m (monomial n a : mv_polynomial σ α) = if n = m then a else 0 :=
161
- single_apply
163
+ by convert single_apply
162
164
163
165
@[simp] lemma coeff_C (m) (a) :
164
166
coeff m (C a : mv_polynomial σ α) = if 0 = m then a else 0 :=
165
- single_apply
167
+ by convert single_apply
166
168
167
169
lemma coeff_X_pow (i : σ) (m) (k : ℕ) :
168
170
coeff m (X i ^ k : mv_polynomial σ α) = if single i k = m then 1 else 0 :=
169
171
begin
170
172
have := coeff_monomial m (finsupp.single i k) (1 :α),
171
- rwa [@monomial_eq _ _ (1 :α) (finsupp.single i k) _ _ _ ,
173
+ rwa [@monomial_eq _ _ (1 :α) (finsupp.single i k) _,
172
174
C_1, one_mul, finsupp.prod_single_index] at this ,
173
175
exact pow_zero _
174
176
end
@@ -202,7 +204,7 @@ begin
202
204
convert this.symm using 1 ; clear this ,
203
205
{ rw [coeff],
204
206
repeat {rw sum_apply, apply finset.sum_congr rfl, intros, dsimp only},
205
- exact single_apply },
207
+ convert single_apply },
206
208
{ have : (antidiagonal n).support.filter (λ x, x.1 ∈ p.support ∧ x.2 ∈ q.support) ⊆
207
209
(antidiagonal n).support := finset.filter_subset _,
208
210
rw [← finset.sum_sdiff this , finset.sum_eq_zero, zero_add], swap,
@@ -354,17 +356,17 @@ begin
354
356
rwa finsupp.mem_support_iff at hc
355
357
end
356
358
357
- @[simp] lemma eval₂_prod [decidable_eq γ] (s : finset γ) (p : γ → mv_polynomial σ α) :
359
+ @[simp] lemma eval₂_prod (s : finset γ) (p : γ → mv_polynomial σ α) :
358
360
eval₂ f g (s.prod p) = s.prod (λ x, eval₂ f g $ p x) :=
359
361
(finset.prod_hom _).symm
360
362
361
- @[simp] lemma eval₂_sum [decidable_eq γ] (s : finset γ) (p : γ → mv_polynomial σ α) :
363
+ @[simp] lemma eval₂_sum (s : finset γ) (p : γ → mv_polynomial σ α) :
362
364
eval₂ f g (s.sum p) = s.sum (λ x, eval₂ f g $ p x) :=
363
365
(finset.sum_hom _).symm
364
366
365
367
attribute [to_additive] eval₂_prod
366
368
367
- lemma eval₂_assoc [decidable_eq γ] (q : γ → mv_polynomial σ α) (p : mv_polynomial γ α) :
369
+ lemma eval₂_assoc (q : γ → mv_polynomial σ α) (p : mv_polynomial γ α) :
368
370
eval₂ f (λ t, eval₂ f g (q t)) p = eval₂ f g (eval₂ C q p) :=
369
371
by { rw eval₂_comp_left (eval₂ f g), congr, funext, simp }
370
372
@@ -392,7 +394,7 @@ eval₂_monomial _ _
392
394
instance eval.is_semiring_hom : is_semiring_hom (eval f) :=
393
395
eval₂.is_semiring_hom _ _
394
396
395
- theorem eval_assoc {τ} [decidable_eq τ]
397
+ theorem eval_assoc {τ}
396
398
(f : σ → mv_polynomial τ α) (g : τ → α)
397
399
(p : mv_polynomial σ α) :
398
400
p.eval (eval g ∘ f) = (eval₂ C f p).eval g :=
404
406
end eval
405
407
406
408
section map
407
- variables [comm_semiring β] [decidable_eq β]
409
+ variables [comm_semiring β]
408
410
variables (f : α → β) [is_semiring_hom f]
409
411
410
412
/-- `map f p` maps a polynomial `p` across a ring hom `f` -/
@@ -434,7 +436,7 @@ eval₂.is_semiring_hom _ _
434
436
435
437
theorem map_id : ∀ (p : mv_polynomial σ α), map id p = p := eval₂_eta
436
438
437
- theorem map_map [comm_semiring γ] [decidable_eq γ]
439
+ theorem map_map [comm_semiring γ]
438
440
(g : β → γ) [is_semiring_hom g]
439
441
(p : mv_polynomial σ α) :
440
442
map g (map f p) = map (g ∘ f) p :=
@@ -461,8 +463,7 @@ begin
461
463
rw [eval₂_mul, is_semiring_hom.map_mul k, map_mul, eval₂_mul, map_X, hp, eval₂_X, eval₂_X] }
462
464
end
463
465
464
- lemma map_eval₂ [decidable_eq γ] [decidable_eq δ]
465
- (f : α → β) [is_semiring_hom f] (g : γ → mv_polynomial δ α) (p : mv_polynomial γ α) :
466
+ lemma map_eval₂ (f : α → β) [is_semiring_hom f] (g : γ → mv_polynomial δ α) (p : mv_polynomial γ α) :
466
467
map f (eval₂ C g p) = eval₂ C (map f ∘ g) (map f p) :=
467
468
begin
468
469
apply mv_polynomial.induction_on p,
@@ -522,19 +523,21 @@ multiset.le_zero.1 $ degrees_monomial _ _
522
523
lemma degrees_X (n : σ) : degrees (X n : mv_polynomial σ α) ≤ {n} :=
523
524
le_trans (degrees_monomial _ _) $ le_of_eq $ to_multiset_single _ _
524
525
525
- lemma degrees_zero : degrees (0 : mv_polynomial σ α) = 0 := degrees_C 0
526
+ lemma degrees_zero : degrees (0 : mv_polynomial σ α) = 0 :=
527
+ by { rw ← C_0, exact degrees_C 0 }
526
528
527
529
lemma degrees_one : degrees (1 : mv_polynomial σ α) = 0 := degrees_C 1
528
530
529
531
lemma degrees_add (p q : mv_polynomial σ α) : (p + q).degrees ≤ p.degrees ⊔ q.degrees :=
530
532
begin
531
533
refine finset.sup_le (assume b hb, _),
532
- cases finset.mem_union.1 (finsupp.support_add hb),
533
- { exact le_sup_left_of_le (finset.le_sup h) },
534
- { exact le_sup_right_of_le (finset.le_sup h) },
534
+ have := finsupp.support_add hb, rw finset.mem_union at this ,
535
+ cases this ,
536
+ { exact le_sup_left_of_le (finset.le_sup this ) },
537
+ { exact le_sup_right_of_le (finset.le_sup this ) },
535
538
end
536
539
537
- lemma degrees_sum {ι : Type *} [decidable_eq ι] (s : finset ι) (f : ι → mv_polynomial σ α) :
540
+ lemma degrees_sum {ι : Type *} (s : finset ι) (f : ι → mv_polynomial σ α) :
538
541
(s.sum f).degrees ≤ s.sup (λi, (f i).degrees) :=
539
542
begin
540
543
refine s.induction _ _,
@@ -554,7 +557,7 @@ begin
554
557
exact add_le_add (finset.le_sup h₁) (finset.le_sup h₂)
555
558
end
556
559
557
- lemma degrees_prod {ι : Type *} [decidable_eq ι] (s : finset ι) (f : ι → mv_polynomial σ α) :
560
+ lemma degrees_prod {ι : Type *} (s : finset ι) (f : ι → mv_polynomial σ α) :
558
561
(s.prod f).degrees ≤ s.sum (λi, (f i).degrees) :=
559
562
begin
560
563
refine s.induction _ _,
@@ -638,9 +641,10 @@ lemma total_degree_add (a b : mv_polynomial σ α) :
638
641
finset.sup_le $ assume n hn,
639
642
have _ := finsupp.support_add hn,
640
643
begin
641
- rcases finset.mem_union.1 this ,
642
- { exact le_max_left_of_le (finset.le_sup h) },
643
- { exact le_max_right_of_le (finset.le_sup h) }
644
+ rw finset.mem_union at this ,
645
+ cases this ,
646
+ { exact le_max_left_of_le (finset.le_sup this ) },
647
+ { exact le_max_right_of_le (finset.le_sup this ) }
644
648
end
645
649
646
650
lemma total_degree_mul (a b : mv_polynomial σ α) :
@@ -763,7 +767,7 @@ congr_fun (int.eq_cast' (f ∘ C)) n
763
767
764
768
/-- A ring homomorphism f : Z[X_1, X_2, ...] → R
765
769
is determined by the evaluations f(X_1), f(X_2), ... -/
766
- @[simp] lemma eval₂_hom_X {α : Type u} [decidable_eq α] (c : ℤ → β) [is_ring_hom c]
770
+ @[simp] lemma eval₂_hom_X {α : Type u} (c : ℤ → β) [is_ring_hom c]
767
771
(f : mv_polynomial α ℤ → β) [is_ring_hom f] (x : mv_polynomial α ℤ) :
768
772
eval₂ c (f ∘ X) x = f x :=
769
773
mv_polynomial.induction_on x
@@ -787,7 +791,7 @@ end eval
787
791
788
792
section map
789
793
790
- variables [decidable_eq β] [ comm_ring β]
794
+ variables [comm_ring β]
791
795
variables (f : α → β) [is_ring_hom f]
792
796
793
797
instance map.is_ring_hom : is_ring_hom (map f : mv_polynomial σ α → mv_polynomial σ β) :=
@@ -802,7 +806,7 @@ end map
802
806
end comm_ring
803
807
804
808
section rename
805
- variables {α} [comm_semiring α] [decidable_eq α] [decidable_eq β] [decidable_eq γ] [decidable_eq δ]
809
+ variables {α} [comm_semiring α]
806
810
807
811
def rename (f : β → γ) : mv_polynomial β α → mv_polynomial γ α :=
808
812
eval₂ C (X ∘ f)
@@ -829,7 +833,7 @@ eval₂_one _ _
829
833
rename f (p + q) = rename f p + rename f q :=
830
834
eval₂_add _ _
831
835
832
- @[simp] lemma rename_sub {α} [comm_ring α] [decidable_eq α]
836
+ @[simp] lemma rename_sub {α} [comm_ring α]
833
837
(f : β → γ) (p q : mv_polynomial β α) :
834
838
rename f (p - q) = rename f p - rename f q :=
835
839
eval₂_sub _ _ _
@@ -895,7 +899,8 @@ finset.sup_le $ assume b,
895
899
assume h,
896
900
rw rename_eq at h,
897
901
have h' := finsupp.map_domain_support h,
898
- rcases finset.mem_image.1 h' with ⟨s, hs, rfl⟩,
902
+ rw finset.mem_image at h',
903
+ rcases h' with ⟨s, hs, rfl⟩,
899
904
rw finsupp.sum_map_domain_index,
900
905
exact le_trans (le_refl _) (finset.le_sup hs),
901
906
exact assume _, rfl,
929
934
930
935
end rename
931
936
932
- lemma eval₂_cast_comp {β : Type u} {γ : Type v} [decidable_eq β] [decidable_eq γ] (f : γ → β)
937
+ lemma eval₂_cast_comp {β : Type u} {γ : Type v} (f : γ → β)
933
938
{α : Type w} [comm_ring α] (c : ℤ → α) [is_ring_hom c] (g : β → α) (x : mv_polynomial γ ℤ) :
934
939
eval₂ c (g ∘ f) x = eval₂ c g (rename f x) :=
935
940
mv_polynomial.induction_on x
@@ -938,15 +943,14 @@ mv_polynomial.induction_on x
938
943
(λ p n hp, by simp only [hp, rename, eval₂_X, eval₂_mul])
939
944
940
945
instance rename.is_ring_hom
941
- {α} [comm_ring α] [decidable_eq α] [decidable_eq β] [decidable_eq γ] (f : β → γ) :
946
+ {α} [comm_ring α] (f : β → γ) :
942
947
is_ring_hom (rename f : mv_polynomial β α → mv_polynomial γ α) :=
943
948
@is_ring_hom.of_semiring (mv_polynomial β α) (mv_polynomial γ α) _ _ (rename f)
944
949
(rename.is_semiring_hom f)
945
950
946
951
section equiv
947
952
948
953
variables (α) [comm_ring α]
949
- variables [decidable_eq β] [decidable_eq γ] [decidable_eq δ]
950
954
951
955
set_option class.instance_max_depth 40
952
956
@@ -1054,10 +1058,10 @@ def mv_polynomial_equiv_mv_polynomial [comm_ring δ]
1054
1058
1055
1059
def sum_ring_equiv : mv_polynomial (β ⊕ γ) α ≃r mv_polynomial β (mv_polynomial γ α) :=
1056
1060
begin
1057
- apply @mv_polynomial_equiv_mv_polynomial α (β ⊕ γ) _ _ _ _ _ _ _ _
1061
+ apply @mv_polynomial_equiv_mv_polynomial α (β ⊕ γ) _ _ _ _
1058
1062
(sum_to_iter α β γ) _ (iter_to_sum α β γ) _,
1059
1063
{ assume p,
1060
- apply @ hom_eq_hom _ _ _ _ _ _ _ _ _ _ _ _ _ p,
1064
+ apply hom_eq_hom _ _ _ _ _ _ p,
1061
1065
apply_instance,
1062
1066
{ apply @is_semiring_hom.comp _ _ _ _ _ _ _ _ _ _,
1063
1067
apply_instance,
0 commit comments