topology.algebra.infinite_sum.ring
⟷
Mathlib.Topology.Algebra.InfiniteSum.Ring
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
-/
import Algebra.BigOperators.NatAntidiagonal
-import Topology.Algebra.InfiniteSum.Basic
+import Topology.Algebra.InfiniteSum.Defs
import Topology.Algebra.Ring.Basic
#align_import topology.algebra.infinite_sum.ring from "leanprover-community/mathlib"@"f47581155c818e6361af4e4fda60d27d020c226b"
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -260,7 +260,7 @@ theorem summable_sum_mul_antidiagonal_of_summable_mul
(h : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
Summable fun n => ∑ kl in Nat.antidiagonal n, f kl.1 * g kl.2 :=
by
- rw [summable_mul_prod_iff_summable_mul_sigma_antidiagonal] at h
+ rw [summable_mul_prod_iff_summable_mul_sigma_antidiagonal] at h
conv =>
congr
ext
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -249,7 +249,7 @@ variable [TopologicalSpace α] [NonUnitalNonAssocSemiring α] {f g : ℕ → α}
theorem summable_mul_prod_iff_summable_mul_sigma_antidiagonal :
(Summable fun x : ℕ × ℕ => f x.1 * g x.2) ↔
Summable fun x : Σ n : ℕ, Nat.antidiagonal n => f (x.2 : ℕ × ℕ).1 * g (x.2 : ℕ × ℕ).2 :=
- Nat.sigmaAntidiagonalEquivProd.summable_iff.symm
+ Finset.sigmaAntidiagonalEquivProd.summable_iff.symm
#align summable_mul_prod_iff_summable_mul_sigma_antidiagonal summable_mul_prod_iff_summable_mul_sigma_antidiagonal
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,9 +3,9 @@ Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
-/
-import Mathbin.Algebra.BigOperators.NatAntidiagonal
-import Mathbin.Topology.Algebra.InfiniteSum.Basic
-import Mathbin.Topology.Algebra.Ring.Basic
+import Algebra.BigOperators.NatAntidiagonal
+import Topology.Algebra.InfiniteSum.Basic
+import Topology.Algebra.Ring.Basic
#align_import topology.algebra.infinite_sum.ring from "leanprover-community/mathlib"@"f47581155c818e6361af4e4fda60d27d020c226b"
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,16 +2,13 @@
Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
-
-! This file was ported from Lean 3 source module topology.algebra.infinite_sum.ring
-! leanprover-community/mathlib commit f47581155c818e6361af4e4fda60d27d020c226b
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Algebra.BigOperators.NatAntidiagonal
import Mathbin.Topology.Algebra.InfiniteSum.Basic
import Mathbin.Topology.Algebra.Ring.Basic
+#align_import topology.algebra.infinite_sum.ring from "leanprover-community/mathlib"@"f47581155c818e6361af4e4fda60d27d020c226b"
+
/-!
# Infinite sum in a ring
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -37,43 +37,59 @@ section NonUnitalNonAssocSemiring
variable [NonUnitalNonAssocSemiring α] [TopologicalSpace α] [TopologicalSemiring α] {f g : ι → α}
{a a₁ a₂ : α}
+#print HasSum.mul_left /-
theorem HasSum.mul_left (a₂) (h : HasSum f a₁) : HasSum (fun i => a₂ * f i) (a₂ * a₁) := by
simpa only using h.map (AddMonoidHom.mulLeft a₂) (continuous_const.mul continuous_id)
#align has_sum.mul_left HasSum.mul_left
+-/
+#print HasSum.mul_right /-
theorem HasSum.mul_right (a₂) (hf : HasSum f a₁) : HasSum (fun i => f i * a₂) (a₁ * a₂) := by
simpa only using hf.map (AddMonoidHom.mulRight a₂) (continuous_id.mul continuous_const)
#align has_sum.mul_right HasSum.mul_right
+-/
+#print Summable.mul_left /-
theorem Summable.mul_left (a) (hf : Summable f) : Summable fun i => a * f i :=
(hf.HasSum.mulLeft _).Summable
#align summable.mul_left Summable.mul_left
+-/
+#print Summable.mul_right /-
theorem Summable.mul_right (a) (hf : Summable f) : Summable fun i => f i * a :=
(hf.HasSum.mulRight _).Summable
#align summable.mul_right Summable.mul_right
+-/
section tsum
variable [T2Space α]
+#print Summable.tsum_mul_left /-
theorem Summable.tsum_mul_left (a) (hf : Summable f) : ∑' i, a * f i = a * ∑' i, f i :=
(hf.HasSum.mulLeft _).tsum_eq
#align summable.tsum_mul_left Summable.tsum_mul_left
+-/
+#print Summable.tsum_mul_right /-
theorem Summable.tsum_mul_right (a) (hf : Summable f) : ∑' i, f i * a = (∑' i, f i) * a :=
(hf.HasSum.mulRight _).tsum_eq
#align summable.tsum_mul_right Summable.tsum_mul_right
+-/
+#print Commute.tsum_right /-
theorem Commute.tsum_right (a) (h : ∀ i, Commute a (f i)) : Commute a (∑' i, f i) :=
if hf : Summable f then
(hf.tsum_mul_left a).symm.trans ((congr_arg _ <| funext h).trans (hf.tsum_mul_right a))
else (tsum_eq_zero_of_not_summable hf).symm ▸ Commute.zero_right _
#align commute.tsum_right Commute.tsum_right
+-/
+#print Commute.tsum_left /-
theorem Commute.tsum_left (a) (h : ∀ i, Commute (f i) a) : Commute (∑' i, f i) a :=
(Commute.tsum_right _ fun i => (h i).symm).symm
#align commute.tsum_left Commute.tsum_left
+-/
end tsum
@@ -84,38 +100,55 @@ section DivisionSemiring
variable [DivisionSemiring α] [TopologicalSpace α] [TopologicalSemiring α] {f g : ι → α}
{a a₁ a₂ : α}
+#print HasSum.div_const /-
theorem HasSum.div_const (h : HasSum f a) (b : α) : HasSum (fun i => f i / b) (a / b) := by
simp only [div_eq_mul_inv, h.mul_right b⁻¹]
#align has_sum.div_const HasSum.div_const
+-/
+#print Summable.div_const /-
theorem Summable.div_const (h : Summable f) (b : α) : Summable fun i => f i / b :=
(h.HasSum.div_const _).Summable
#align summable.div_const Summable.div_const
+-/
+#print hasSum_mul_left_iff /-
theorem hasSum_mul_left_iff (h : a₂ ≠ 0) : HasSum (fun i => a₂ * f i) (a₂ * a₁) ↔ HasSum f a₁ :=
⟨fun H => by simpa only [inv_mul_cancel_left₀ h] using H.mul_left a₂⁻¹, HasSum.mul_left _⟩
#align has_sum_mul_left_iff hasSum_mul_left_iff
+-/
+#print hasSum_mul_right_iff /-
theorem hasSum_mul_right_iff (h : a₂ ≠ 0) : HasSum (fun i => f i * a₂) (a₁ * a₂) ↔ HasSum f a₁ :=
⟨fun H => by simpa only [mul_inv_cancel_right₀ h] using H.mul_right a₂⁻¹, HasSum.mul_right _⟩
#align has_sum_mul_right_iff hasSum_mul_right_iff
+-/
+#print hasSum_div_const_iff /-
theorem hasSum_div_const_iff (h : a₂ ≠ 0) : HasSum (fun i => f i / a₂) (a₁ / a₂) ↔ HasSum f a₁ := by
simpa only [div_eq_mul_inv] using hasSum_mul_right_iff (inv_ne_zero h)
#align has_sum_div_const_iff hasSum_div_const_iff
+-/
+#print summable_mul_left_iff /-
theorem summable_mul_left_iff (h : a ≠ 0) : (Summable fun i => a * f i) ↔ Summable f :=
⟨fun H => by simpa only [inv_mul_cancel_left₀ h] using H.mul_left a⁻¹, fun H => H.mulLeft _⟩
#align summable_mul_left_iff summable_mul_left_iff
+-/
+#print summable_mul_right_iff /-
theorem summable_mul_right_iff (h : a ≠ 0) : (Summable fun i => f i * a) ↔ Summable f :=
⟨fun H => by simpa only [mul_inv_cancel_right₀ h] using H.mul_right a⁻¹, fun H => H.mulRight _⟩
#align summable_mul_right_iff summable_mul_right_iff
+-/
+#print summable_div_const_iff /-
theorem summable_div_const_iff (h : a ≠ 0) : (Summable fun i => f i / a) ↔ Summable f := by
simpa only [div_eq_mul_inv] using summable_mul_right_iff (inv_ne_zero h)
#align summable_div_const_iff summable_div_const_iff
+-/
+#print tsum_mul_left /-
theorem tsum_mul_left [T2Space α] : ∑' x, a * f x = a * ∑' x, f x :=
if hf : Summable f then hf.tsum_mul_left a
else
@@ -124,7 +157,9 @@ theorem tsum_mul_left [T2Space α] : ∑' x, a * f x = a * ∑' x, f x :=
rw [tsum_eq_zero_of_not_summable hf,
tsum_eq_zero_of_not_summable (mt (summable_mul_left_iff ha).mp hf), MulZeroClass.mul_zero]
#align tsum_mul_left tsum_mul_left
+-/
+#print tsum_mul_right /-
theorem tsum_mul_right [T2Space α] : ∑' x, f x * a = (∑' x, f x) * a :=
if hf : Summable f then hf.tsum_mul_right a
else
@@ -133,10 +168,13 @@ theorem tsum_mul_right [T2Space α] : ∑' x, f x * a = (∑' x, f x) * a :=
rw [tsum_eq_zero_of_not_summable hf,
tsum_eq_zero_of_not_summable (mt (summable_mul_right_iff ha).mp hf), MulZeroClass.zero_mul]
#align tsum_mul_right tsum_mul_right
+-/
+#print tsum_div_const /-
theorem tsum_div_const [T2Space α] : ∑' x, f x / a = (∑' x, f x) / a := by
simpa only [div_eq_mul_inv] using tsum_mul_right
#align tsum_div_const tsum_div_const
+-/
end DivisionSemiring
@@ -161,6 +199,7 @@ section tsum_mul_tsum
variable [TopologicalSpace α] [T3Space α] [NonUnitalNonAssocSemiring α] [TopologicalSemiring α]
{f : ι → α} {g : κ → α} {s t u : α}
+#print HasSum.mul_eq /-
theorem HasSum.mul_eq (hf : HasSum f s) (hg : HasSum g t)
(hfg : HasSum (fun x : ι × κ => f x.1 * g x.2) u) : s * t = u :=
have key₁ : HasSum (fun i => f i * t) (s * t) := hf.mulRight t
@@ -168,14 +207,18 @@ theorem HasSum.mul_eq (hf : HasSum f s) (hg : HasSum g t)
have key₂ : HasSum (fun i => f i * t) u := HasSum.prod_fiberwise hfg this
key₁.unique key₂
#align has_sum.mul_eq HasSum.mul_eq
+-/
+#print HasSum.mul /-
theorem HasSum.mul (hf : HasSum f s) (hg : HasSum g t)
(hfg : Summable fun x : ι × κ => f x.1 * g x.2) :
HasSum (fun x : ι × κ => f x.1 * g x.2) (s * t) :=
let ⟨u, hu⟩ := hfg
(hf.mul_eq hg hu).symm ▸ hu
#align has_sum.mul HasSum.mul
+-/
+#print tsum_mul_tsum /-
/-- Product of two infinites sums indexed by arbitrary types.
See also `tsum_mul_tsum_of_summable_norm` if `f` and `g` are abolutely summable. -/
theorem tsum_mul_tsum (hf : Summable f) (hg : Summable g)
@@ -183,6 +226,7 @@ theorem tsum_mul_tsum (hf : Summable f) (hg : Summable g)
(∑' x, f x) * ∑' y, g y = ∑' z : ι × κ, f z.1 * g z.2 :=
hf.HasSum.mul_eq hg.HasSum hfg.HasSum
#align tsum_mul_tsum tsum_mul_tsum
+-/
end tsum_mul_tsum
@@ -202,6 +246,7 @@ section cauchy_product
variable [TopologicalSpace α] [NonUnitalNonAssocSemiring α] {f g : ℕ → α}
+#print summable_mul_prod_iff_summable_mul_sigma_antidiagonal /-
/- The family `(k, l) : ℕ × ℕ ↦ f k * g l` is summable if and only if the family
`(n, k, l) : Σ (n : ℕ), nat.antidiagonal n ↦ f k * g l` is summable. -/
theorem summable_mul_prod_iff_summable_mul_sigma_antidiagonal :
@@ -209,9 +254,11 @@ theorem summable_mul_prod_iff_summable_mul_sigma_antidiagonal :
Summable fun x : Σ n : ℕ, Nat.antidiagonal n => f (x.2 : ℕ × ℕ).1 * g (x.2 : ℕ × ℕ).2 :=
Nat.sigmaAntidiagonalEquivProd.summable_iff.symm
#align summable_mul_prod_iff_summable_mul_sigma_antidiagonal summable_mul_prod_iff_summable_mul_sigma_antidiagonal
+-/
variable [T3Space α] [TopologicalSemiring α]
+#print summable_sum_mul_antidiagonal_of_summable_mul /-
theorem summable_sum_mul_antidiagonal_of_summable_mul
(h : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
Summable fun n => ∑ kl in Nat.antidiagonal n, f kl.1 * g kl.2 :=
@@ -223,7 +270,9 @@ theorem summable_sum_mul_antidiagonal_of_summable_mul
rw [← Finset.sum_finset_coe, ← tsum_fintype]
exact h.sigma' fun n => (hasSum_fintype _).Summable
#align summable_sum_mul_antidiagonal_of_summable_mul summable_sum_mul_antidiagonal_of_summable_mul
+-/
+#print tsum_mul_tsum_eq_tsum_sum_antidiagonal /-
/-- The **Cauchy product formula** for the product of two infinites sums indexed by `ℕ`, expressed
by summing on `finset.nat.antidiagonal`.
@@ -242,14 +291,18 @@ theorem tsum_mul_tsum_eq_tsum_sum_antidiagonal (hf : Summable f) (hg : Summable
tsum_sigma' (fun n => (hasSum_fintype _).Summable)
(summable_mul_prod_iff_summable_mul_sigma_antidiagonal.mp hfg)
#align tsum_mul_tsum_eq_tsum_sum_antidiagonal tsum_mul_tsum_eq_tsum_sum_antidiagonal
+-/
+#print summable_sum_mul_range_of_summable_mul /-
theorem summable_sum_mul_range_of_summable_mul (h : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
Summable fun n => ∑ k in range (n + 1), f k * g (n - k) :=
by
simp_rw [← nat.sum_antidiagonal_eq_sum_range_succ fun k l => f k * g l]
exact summable_sum_mul_antidiagonal_of_summable_mul h
#align summable_sum_mul_range_of_summable_mul summable_sum_mul_range_of_summable_mul
+-/
+#print tsum_mul_tsum_eq_tsum_sum_range /-
/-- The **Cauchy product formula** for the product of two infinites sums indexed by `ℕ`, expressed
by summing on `finset.range`.
@@ -262,6 +315,7 @@ theorem tsum_mul_tsum_eq_tsum_sum_range (hf : Summable f) (hg : Summable g)
simp_rw [← nat.sum_antidiagonal_eq_sum_range_succ fun k l => f k * g l]
exact tsum_mul_tsum_eq_tsum_sum_antidiagonal hf hg hfg
#align tsum_mul_tsum_eq_tsum_sum_range tsum_mul_tsum_eq_tsum_sum_range
+-/
end cauchy_product
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3e83f0fa4391c8740f7d773a7a9b74e311ae2a3
@@ -57,11 +57,11 @@ section tsum
variable [T2Space α]
-theorem Summable.tsum_mul_left (a) (hf : Summable f) : (∑' i, a * f i) = a * ∑' i, f i :=
+theorem Summable.tsum_mul_left (a) (hf : Summable f) : ∑' i, a * f i = a * ∑' i, f i :=
(hf.HasSum.mulLeft _).tsum_eq
#align summable.tsum_mul_left Summable.tsum_mul_left
-theorem Summable.tsum_mul_right (a) (hf : Summable f) : (∑' i, f i * a) = (∑' i, f i) * a :=
+theorem Summable.tsum_mul_right (a) (hf : Summable f) : ∑' i, f i * a = (∑' i, f i) * a :=
(hf.HasSum.mulRight _).tsum_eq
#align summable.tsum_mul_right Summable.tsum_mul_right
@@ -116,7 +116,7 @@ theorem summable_div_const_iff (h : a ≠ 0) : (Summable fun i => f i / a) ↔ S
simpa only [div_eq_mul_inv] using summable_mul_right_iff (inv_ne_zero h)
#align summable_div_const_iff summable_div_const_iff
-theorem tsum_mul_left [T2Space α] : (∑' x, a * f x) = a * ∑' x, f x :=
+theorem tsum_mul_left [T2Space α] : ∑' x, a * f x = a * ∑' x, f x :=
if hf : Summable f then hf.tsum_mul_left a
else
if ha : a = 0 then by simp [ha]
@@ -125,7 +125,7 @@ theorem tsum_mul_left [T2Space α] : (∑' x, a * f x) = a * ∑' x, f x :=
tsum_eq_zero_of_not_summable (mt (summable_mul_left_iff ha).mp hf), MulZeroClass.mul_zero]
#align tsum_mul_left tsum_mul_left
-theorem tsum_mul_right [T2Space α] : (∑' x, f x * a) = (∑' x, f x) * a :=
+theorem tsum_mul_right [T2Space α] : ∑' x, f x * a = (∑' x, f x) * a :=
if hf : Summable f then hf.tsum_mul_right a
else
if ha : a = 0 then by simp [ha]
@@ -134,7 +134,7 @@ theorem tsum_mul_right [T2Space α] : (∑' x, f x * a) = (∑' x, f x) * a :=
tsum_eq_zero_of_not_summable (mt (summable_mul_right_iff ha).mp hf), MulZeroClass.zero_mul]
#align tsum_mul_right tsum_mul_right
-theorem tsum_div_const [T2Space α] : (∑' x, f x / a) = (∑' x, f x) / a := by
+theorem tsum_div_const [T2Space α] : ∑' x, f x / a = (∑' x, f x) / a := by
simpa only [div_eq_mul_inv] using tsum_mul_right
#align tsum_div_const tsum_div_const
@@ -180,7 +180,7 @@ theorem HasSum.mul (hf : HasSum f s) (hg : HasSum g t)
See also `tsum_mul_tsum_of_summable_norm` if `f` and `g` are abolutely summable. -/
theorem tsum_mul_tsum (hf : Summable f) (hg : Summable g)
(hfg : Summable fun x : ι × κ => f x.1 * g x.2) :
- ((∑' x, f x) * ∑' y, g y) = ∑' z : ι × κ, f z.1 * g z.2 :=
+ (∑' x, f x) * ∑' y, g y = ∑' z : ι × κ, f z.1 * g z.2 :=
hf.HasSum.mul_eq hg.HasSum hfg.HasSum
#align tsum_mul_tsum tsum_mul_tsum
@@ -231,7 +231,7 @@ See also `tsum_mul_tsum_eq_tsum_sum_antidiagonal_of_summable_norm` if `f` and `g
summable. -/
theorem tsum_mul_tsum_eq_tsum_sum_antidiagonal (hf : Summable f) (hg : Summable g)
(hfg : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
- ((∑' n, f n) * ∑' n, g n) = ∑' n, ∑ kl in Nat.antidiagonal n, f kl.1 * g kl.2 :=
+ (∑' n, f n) * ∑' n, g n = ∑' n, ∑ kl in Nat.antidiagonal n, f kl.1 * g kl.2 :=
by
conv_rhs =>
congr
@@ -257,7 +257,7 @@ See also `tsum_mul_tsum_eq_tsum_sum_range_of_summable_norm` if `f` and `g` are a
-/
theorem tsum_mul_tsum_eq_tsum_sum_range (hf : Summable f) (hg : Summable g)
(hfg : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
- ((∑' n, f n) * ∑' n, g n) = ∑' n, ∑ k in range (n + 1), f k * g (n - k) :=
+ (∑' n, f n) * ∑' n, g n = ∑' n, ∑ k in range (n + 1), f k * g (n - k) :=
by
simp_rw [← nat.sum_antidiagonal_eq_sum_range_succ fun k l => f k * g l]
exact tsum_mul_tsum_eq_tsum_sum_antidiagonal hf hg hfg
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -206,7 +206,7 @@ variable [TopologicalSpace α] [NonUnitalNonAssocSemiring α] {f g : ℕ → α}
`(n, k, l) : Σ (n : ℕ), nat.antidiagonal n ↦ f k * g l` is summable. -/
theorem summable_mul_prod_iff_summable_mul_sigma_antidiagonal :
(Summable fun x : ℕ × ℕ => f x.1 * g x.2) ↔
- Summable fun x : Σn : ℕ, Nat.antidiagonal n => f (x.2 : ℕ × ℕ).1 * g (x.2 : ℕ × ℕ).2 :=
+ Summable fun x : Σ n : ℕ, Nat.antidiagonal n => f (x.2 : ℕ × ℕ).1 * g (x.2 : ℕ × ℕ).2 :=
Nat.sigmaAntidiagonalEquivProd.summable_iff.symm
#align summable_mul_prod_iff_summable_mul_sigma_antidiagonal summable_mul_prod_iff_summable_mul_sigma_antidiagonal
@@ -216,7 +216,7 @@ theorem summable_sum_mul_antidiagonal_of_summable_mul
(h : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
Summable fun n => ∑ kl in Nat.antidiagonal n, f kl.1 * g kl.2 :=
by
- rw [summable_mul_prod_iff_summable_mul_sigma_antidiagonal] at h
+ rw [summable_mul_prod_iff_summable_mul_sigma_antidiagonal] at h
conv =>
congr
ext
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -28,7 +28,7 @@ This file provides lemmas about the interaction between infinite sums and multip
open Filter Finset Function
-open BigOperators Classical
+open scoped BigOperators Classical
variable {ι κ R α : Type _}
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -37,42 +37,18 @@ section NonUnitalNonAssocSemiring
variable [NonUnitalNonAssocSemiring α] [TopologicalSpace α] [TopologicalSemiring α] {f g : ι → α}
{a a₁ a₂ : α}
-/- warning: has_sum.mul_left -> HasSum.mul_left is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} {a₁ : α} (a₂ : α), (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f a₁) -> (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) a₂ (f i)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) a₂ a₁))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} {a₁ : α} (a₂ : α), (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f a₁) -> (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) a₂ (f i)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) a₂ a₁))
-Case conversion may be inaccurate. Consider using '#align has_sum.mul_left HasSum.mul_leftₓ'. -/
theorem HasSum.mul_left (a₂) (h : HasSum f a₁) : HasSum (fun i => a₂ * f i) (a₂ * a₁) := by
simpa only using h.map (AddMonoidHom.mulLeft a₂) (continuous_const.mul continuous_id)
#align has_sum.mul_left HasSum.mul_left
-/- warning: has_sum.mul_right -> HasSum.mul_right is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} {a₁ : α} (a₂ : α), (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f a₁) -> (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) (f i) a₂) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) a₁ a₂))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} {a₁ : α} (a₂ : α), (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f a₁) -> (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) (f i) a₂) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) a₁ a₂))
-Case conversion may be inaccurate. Consider using '#align has_sum.mul_right HasSum.mul_rightₓ'. -/
theorem HasSum.mul_right (a₂) (hf : HasSum f a₁) : HasSum (fun i => f i * a₂) (a₁ * a₂) := by
simpa only using hf.map (AddMonoidHom.mulRight a₂) (continuous_id.mul continuous_const)
#align has_sum.mul_right HasSum.mul_right
-/- warning: summable.mul_left -> Summable.mul_left is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) a (f i)))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) a (f i)))
-Case conversion may be inaccurate. Consider using '#align summable.mul_left Summable.mul_leftₓ'. -/
theorem Summable.mul_left (a) (hf : Summable f) : Summable fun i => a * f i :=
(hf.HasSum.mulLeft _).Summable
#align summable.mul_left Summable.mul_left
-/- warning: summable.mul_right -> Summable.mul_right is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) (f i) a))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) (f i) a))
-Case conversion may be inaccurate. Consider using '#align summable.mul_right Summable.mul_rightₓ'. -/
theorem Summable.mul_right (a) (hf : Summable f) : Summable fun i => f i * a :=
(hf.HasSum.mulRight _).Summable
#align summable.mul_right Summable.mul_right
@@ -81,44 +57,20 @@ section tsum
variable [T2Space α]
-/- warning: summable.tsum_mul_left -> Summable.tsum_mul_left is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) a (f i))) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) a (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i))))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) a (f i))) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) a (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i))))
-Case conversion may be inaccurate. Consider using '#align summable.tsum_mul_left Summable.tsum_mul_leftₓ'. -/
theorem Summable.tsum_mul_left (a) (hf : Summable f) : (∑' i, a * f i) = a * ∑' i, f i :=
(hf.HasSum.mulLeft _).tsum_eq
#align summable.tsum_mul_left Summable.tsum_mul_left
-/- warning: summable.tsum_mul_right -> Summable.tsum_mul_right is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) (f i) a)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i)) a))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) (f i) a)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i)) a))
-Case conversion may be inaccurate. Consider using '#align summable.tsum_mul_right Summable.tsum_mul_rightₓ'. -/
theorem Summable.tsum_mul_right (a) (hf : Summable f) : (∑' i, f i * a) = (∑' i, f i) * a :=
(hf.HasSum.mulRight _).tsum_eq
#align summable.tsum_mul_right Summable.tsum_mul_right
-/- warning: commute.tsum_right -> Commute.tsum_right is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (forall (i : ι), Commute.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1)) a (f i)) -> (Commute.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1)) a (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (forall (i : ι), Commute.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1) a (f i)) -> (Commute.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1) a (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align commute.tsum_right Commute.tsum_rightₓ'. -/
theorem Commute.tsum_right (a) (h : ∀ i, Commute a (f i)) : Commute a (∑' i, f i) :=
if hf : Summable f then
(hf.tsum_mul_left a).symm.trans ((congr_arg _ <| funext h).trans (hf.tsum_mul_right a))
else (tsum_eq_zero_of_not_summable hf).symm ▸ Commute.zero_right _
#align commute.tsum_right Commute.tsum_right
-/- warning: commute.tsum_left -> Commute.tsum_left is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (forall (i : ι), Commute.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1)) (f i) a) -> (Commute.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1)) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i)) a)
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (forall (i : ι), Commute.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1) (f i) a) -> (Commute.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i)) a)
-Case conversion may be inaccurate. Consider using '#align commute.tsum_left Commute.tsum_leftₓ'. -/
theorem Commute.tsum_left (a) (h : ∀ i, Commute (f i) a) : Commute (∑' i, f i) a :=
(Commute.tsum_right _ fun i => (h i).symm).symm
#align commute.tsum_left Commute.tsum_left
@@ -132,92 +84,38 @@ section DivisionSemiring
variable [DivisionSemiring α] [TopologicalSpace α] [TopologicalSemiring α] {f g : ι → α}
{a a₁ a₂ : α}
-/- warning: has_sum.div_const -> HasSum.div_const is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a) -> (forall (b : α), HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) (f i) b) (HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) a b))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a) -> (forall (b : α), HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) (f i) b) (HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) a b))
-Case conversion may be inaccurate. Consider using '#align has_sum.div_const HasSum.div_constₓ'. -/
theorem HasSum.div_const (h : HasSum f a) (b : α) : HasSum (fun i => f i / b) (a / b) := by
simp only [div_eq_mul_inv, h.mul_right b⁻¹]
#align has_sum.div_const HasSum.div_const
-/- warning: summable.div_const -> Summable.div_const is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α}, (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f) -> (forall (b : α), Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) (f i) b))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α}, (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f) -> (forall (b : α), Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) (f i) b))
-Case conversion may be inaccurate. Consider using '#align summable.div_const Summable.div_constₓ'. -/
theorem Summable.div_const (h : Summable f) (b : α) : Summable fun i => f i / b :=
(h.HasSum.div_const _).Summable
#align summable.div_const Summable.div_const
-/- warning: has_sum_mul_left_iff -> hasSum_mul_left_iff is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a₁ : α} {a₂ : α}, (Ne.{succ u2} α a₂ (OfNat.ofNat.{u2} α 0 (OfNat.mk.{u2} α 0 (Zero.zero.{u2} α (MulZeroClass.toHasZero.{u2} α (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))))))) -> (Iff (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) a₂ (f i)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) a₂ a₁)) (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a₁))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a₁ : α} {a₂ : α}, (Ne.{succ u2} α a₂ (OfNat.ofNat.{u2} α 0 (Zero.toOfNat0.{u2} α (MonoidWithZero.toZero.{u2} α (Semiring.toMonoidWithZero.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) -> (Iff (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) a₂ (f i)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) a₂ a₁)) (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a₁))
-Case conversion may be inaccurate. Consider using '#align has_sum_mul_left_iff hasSum_mul_left_iffₓ'. -/
theorem hasSum_mul_left_iff (h : a₂ ≠ 0) : HasSum (fun i => a₂ * f i) (a₂ * a₁) ↔ HasSum f a₁ :=
⟨fun H => by simpa only [inv_mul_cancel_left₀ h] using H.mul_left a₂⁻¹, HasSum.mul_left _⟩
#align has_sum_mul_left_iff hasSum_mul_left_iff
-/- warning: has_sum_mul_right_iff -> hasSum_mul_right_iff is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a₁ : α} {a₂ : α}, (Ne.{succ u2} α a₂ (OfNat.ofNat.{u2} α 0 (OfNat.mk.{u2} α 0 (Zero.zero.{u2} α (MulZeroClass.toHasZero.{u2} α (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))))))) -> (Iff (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) (f i) a₂) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) a₁ a₂)) (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a₁))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a₁ : α} {a₂ : α}, (Ne.{succ u2} α a₂ (OfNat.ofNat.{u2} α 0 (Zero.toOfNat0.{u2} α (MonoidWithZero.toZero.{u2} α (Semiring.toMonoidWithZero.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) -> (Iff (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) (f i) a₂) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) a₁ a₂)) (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a₁))
-Case conversion may be inaccurate. Consider using '#align has_sum_mul_right_iff hasSum_mul_right_iffₓ'. -/
theorem hasSum_mul_right_iff (h : a₂ ≠ 0) : HasSum (fun i => f i * a₂) (a₁ * a₂) ↔ HasSum f a₁ :=
⟨fun H => by simpa only [mul_inv_cancel_right₀ h] using H.mul_right a₂⁻¹, HasSum.mul_right _⟩
#align has_sum_mul_right_iff hasSum_mul_right_iff
-/- warning: has_sum_div_const_iff -> hasSum_div_const_iff is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a₁ : α} {a₂ : α}, (Ne.{succ u2} α a₂ (OfNat.ofNat.{u2} α 0 (OfNat.mk.{u2} α 0 (Zero.zero.{u2} α (MulZeroClass.toHasZero.{u2} α (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))))))) -> (Iff (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) (f i) a₂) (HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) a₁ a₂)) (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a₁))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a₁ : α} {a₂ : α}, (Ne.{succ u2} α a₂ (OfNat.ofNat.{u2} α 0 (Zero.toOfNat0.{u2} α (MonoidWithZero.toZero.{u2} α (Semiring.toMonoidWithZero.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) -> (Iff (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) (f i) a₂) (HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) a₁ a₂)) (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a₁))
-Case conversion may be inaccurate. Consider using '#align has_sum_div_const_iff hasSum_div_const_iffₓ'. -/
theorem hasSum_div_const_iff (h : a₂ ≠ 0) : HasSum (fun i => f i / a₂) (a₁ / a₂) ↔ HasSum f a₁ := by
simpa only [div_eq_mul_inv] using hasSum_mul_right_iff (inv_ne_zero h)
#align has_sum_div_const_iff hasSum_div_const_iff
-/- warning: summable_mul_left_iff -> summable_mul_left_iff is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (Ne.{succ u2} α a (OfNat.ofNat.{u2} α 0 (OfNat.mk.{u2} α 0 (Zero.zero.{u2} α (MulZeroClass.toHasZero.{u2} α (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))))))) -> (Iff (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) a (f i))) (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (Ne.{succ u2} α a (OfNat.ofNat.{u2} α 0 (Zero.toOfNat0.{u2} α (MonoidWithZero.toZero.{u2} α (Semiring.toMonoidWithZero.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) -> (Iff (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) a (f i))) (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f))
-Case conversion may be inaccurate. Consider using '#align summable_mul_left_iff summable_mul_left_iffₓ'. -/
theorem summable_mul_left_iff (h : a ≠ 0) : (Summable fun i => a * f i) ↔ Summable f :=
⟨fun H => by simpa only [inv_mul_cancel_left₀ h] using H.mul_left a⁻¹, fun H => H.mulLeft _⟩
#align summable_mul_left_iff summable_mul_left_iff
-/- warning: summable_mul_right_iff -> summable_mul_right_iff is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (Ne.{succ u2} α a (OfNat.ofNat.{u2} α 0 (OfNat.mk.{u2} α 0 (Zero.zero.{u2} α (MulZeroClass.toHasZero.{u2} α (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))))))) -> (Iff (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) (f i) a)) (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (Ne.{succ u2} α a (OfNat.ofNat.{u2} α 0 (Zero.toOfNat0.{u2} α (MonoidWithZero.toZero.{u2} α (Semiring.toMonoidWithZero.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) -> (Iff (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) (f i) a)) (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f))
-Case conversion may be inaccurate. Consider using '#align summable_mul_right_iff summable_mul_right_iffₓ'. -/
theorem summable_mul_right_iff (h : a ≠ 0) : (Summable fun i => f i * a) ↔ Summable f :=
⟨fun H => by simpa only [mul_inv_cancel_right₀ h] using H.mul_right a⁻¹, fun H => H.mulRight _⟩
#align summable_mul_right_iff summable_mul_right_iff
-/- warning: summable_div_const_iff -> summable_div_const_iff is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (Ne.{succ u2} α a (OfNat.ofNat.{u2} α 0 (OfNat.mk.{u2} α 0 (Zero.zero.{u2} α (MulZeroClass.toHasZero.{u2} α (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))))))) -> (Iff (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) (f i) a)) (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (Ne.{succ u2} α a (OfNat.ofNat.{u2} α 0 (Zero.toOfNat0.{u2} α (MonoidWithZero.toZero.{u2} α (Semiring.toMonoidWithZero.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) -> (Iff (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) (f i) a)) (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f))
-Case conversion may be inaccurate. Consider using '#align summable_div_const_iff summable_div_const_iffₓ'. -/
theorem summable_div_const_iff (h : a ≠ 0) : (Summable fun i => f i / a) ↔ Summable f := by
simpa only [div_eq_mul_inv] using summable_mul_right_iff (inv_ne_zero h)
#align summable_div_const_iff summable_div_const_iff
-/- warning: tsum_mul_left -> tsum_mul_left is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α} [_inst_4 : T2Space.{u2} α _inst_2], Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) a (f x))) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) a (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => f x)))
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α} [_inst_4 : T2Space.{u2} α _inst_2], Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) a (f x))) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) a (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => f x)))
-Case conversion may be inaccurate. Consider using '#align tsum_mul_left tsum_mul_leftₓ'. -/
theorem tsum_mul_left [T2Space α] : (∑' x, a * f x) = a * ∑' x, f x :=
if hf : Summable f then hf.tsum_mul_left a
else
@@ -227,12 +125,6 @@ theorem tsum_mul_left [T2Space α] : (∑' x, a * f x) = a * ∑' x, f x :=
tsum_eq_zero_of_not_summable (mt (summable_mul_left_iff ha).mp hf), MulZeroClass.mul_zero]
#align tsum_mul_left tsum_mul_left
-/- warning: tsum_mul_right -> tsum_mul_right is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α} [_inst_4 : T2Space.{u2} α _inst_2], Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) (f x) a)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => f x)) a)
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α} [_inst_4 : T2Space.{u2} α _inst_2], Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) (f x) a)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => f x)) a)
-Case conversion may be inaccurate. Consider using '#align tsum_mul_right tsum_mul_rightₓ'. -/
theorem tsum_mul_right [T2Space α] : (∑' x, f x * a) = (∑' x, f x) * a :=
if hf : Summable f then hf.tsum_mul_right a
else
@@ -242,12 +134,6 @@ theorem tsum_mul_right [T2Space α] : (∑' x, f x * a) = (∑' x, f x) * a :=
tsum_eq_zero_of_not_summable (mt (summable_mul_right_iff ha).mp hf), MulZeroClass.zero_mul]
#align tsum_mul_right tsum_mul_right
-/- warning: tsum_div_const -> tsum_div_const is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α} [_inst_4 : T2Space.{u2} α _inst_2], Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) (f x) a)) (HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => f x)) a)
-but is expected to have type
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α} [_inst_4 : T2Space.{u2} α _inst_2], Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) (f x) a)) (HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => f x)) a)
-Case conversion may be inaccurate. Consider using '#align tsum_div_const tsum_div_constₓ'. -/
theorem tsum_div_const [T2Space α] : (∑' x, f x / a) = (∑' x, f x) / a := by
simpa only [div_eq_mul_inv] using tsum_mul_right
#align tsum_div_const tsum_div_const
@@ -275,12 +161,6 @@ section tsum_mul_tsum
variable [TopologicalSpace α] [T3Space α] [NonUnitalNonAssocSemiring α] [TopologicalSemiring α]
{f : ι → α} {g : κ → α} {s t u : α}
-/- warning: has_sum.mul_eq -> HasSum.mul_eq is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {κ : Type.{u2}} {α : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : T3Space.{u3} α _inst_1] [_inst_3 : NonUnitalNonAssocSemiring.{u3} α] [_inst_4 : TopologicalSemiring.{u3} α _inst_1 _inst_3] {f : ι -> α} {g : κ -> α} {s : α} {t : α} {u : α}, (HasSum.{u3, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 f s) -> (HasSum.{u3, u2} α κ (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 g t) -> (HasSum.{u3, max u1 u2} α (Prod.{u1, u2} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u1, u2} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) (f (Prod.fst.{u1, u2} ι κ x)) (g (Prod.snd.{u1, u2} ι κ x))) u) -> (Eq.{succ u3} α (HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) s t) u)
-but is expected to have type
- forall {ι : Type.{u2}} {κ : Type.{u1}} {α : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : T3Space.{u3} α _inst_1] [_inst_3 : NonUnitalNonAssocSemiring.{u3} α] [_inst_4 : TopologicalSemiring.{u3} α _inst_1 _inst_3] {f : ι -> α} {g : κ -> α} {s : α} {t : α} {u : α}, (HasSum.{u3, u2} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 f s) -> (HasSum.{u3, u1} α κ (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 g t) -> (HasSum.{u3, max u2 u1} α (Prod.{u2, u1} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u2, u1} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) (f (Prod.fst.{u2, u1} ι κ x)) (g (Prod.snd.{u2, u1} ι κ x))) u) -> (Eq.{succ u3} α (HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) s t) u)
-Case conversion may be inaccurate. Consider using '#align has_sum.mul_eq HasSum.mul_eqₓ'. -/
theorem HasSum.mul_eq (hf : HasSum f s) (hg : HasSum g t)
(hfg : HasSum (fun x : ι × κ => f x.1 * g x.2) u) : s * t = u :=
have key₁ : HasSum (fun i => f i * t) (s * t) := hf.mulRight t
@@ -289,12 +169,6 @@ theorem HasSum.mul_eq (hf : HasSum f s) (hg : HasSum g t)
key₁.unique key₂
#align has_sum.mul_eq HasSum.mul_eq
-/- warning: has_sum.mul -> HasSum.mul is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {κ : Type.{u2}} {α : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : T3Space.{u3} α _inst_1] [_inst_3 : NonUnitalNonAssocSemiring.{u3} α] [_inst_4 : TopologicalSemiring.{u3} α _inst_1 _inst_3] {f : ι -> α} {g : κ -> α} {s : α} {t : α}, (HasSum.{u3, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 f s) -> (HasSum.{u3, u2} α κ (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 g t) -> (Summable.{u3, max u1 u2} α (Prod.{u1, u2} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u1, u2} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) (f (Prod.fst.{u1, u2} ι κ x)) (g (Prod.snd.{u1, u2} ι κ x)))) -> (HasSum.{u3, max u1 u2} α (Prod.{u1, u2} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u1, u2} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) (f (Prod.fst.{u1, u2} ι κ x)) (g (Prod.snd.{u1, u2} ι κ x))) (HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) s t))
-but is expected to have type
- forall {ι : Type.{u2}} {κ : Type.{u1}} {α : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : T3Space.{u3} α _inst_1] [_inst_3 : NonUnitalNonAssocSemiring.{u3} α] [_inst_4 : TopologicalSemiring.{u3} α _inst_1 _inst_3] {f : ι -> α} {g : κ -> α} {s : α} {t : α}, (HasSum.{u3, u2} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 f s) -> (HasSum.{u3, u1} α κ (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 g t) -> (Summable.{u3, max u2 u1} α (Prod.{u2, u1} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u2, u1} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) (f (Prod.fst.{u2, u1} ι κ x)) (g (Prod.snd.{u2, u1} ι κ x)))) -> (HasSum.{u3, max u2 u1} α (Prod.{u2, u1} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u2, u1} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) (f (Prod.fst.{u2, u1} ι κ x)) (g (Prod.snd.{u2, u1} ι κ x))) (HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) s t))
-Case conversion may be inaccurate. Consider using '#align has_sum.mul HasSum.mulₓ'. -/
theorem HasSum.mul (hf : HasSum f s) (hg : HasSum g t)
(hfg : Summable fun x : ι × κ => f x.1 * g x.2) :
HasSum (fun x : ι × κ => f x.1 * g x.2) (s * t) :=
@@ -302,12 +176,6 @@ theorem HasSum.mul (hf : HasSum f s) (hg : HasSum g t)
(hf.mul_eq hg hu).symm ▸ hu
#align has_sum.mul HasSum.mul
-/- warning: tsum_mul_tsum -> tsum_mul_tsum is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {κ : Type.{u2}} {α : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : T3Space.{u3} α _inst_1] [_inst_3 : NonUnitalNonAssocSemiring.{u3} α] [_inst_4 : TopologicalSemiring.{u3} α _inst_1 _inst_3] {f : ι -> α} {g : κ -> α}, (Summable.{u3, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 f) -> (Summable.{u3, u2} α κ (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 g) -> (Summable.{u3, max u1 u2} α (Prod.{u1, u2} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u1, u2} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) (f (Prod.fst.{u1, u2} ι κ x)) (g (Prod.snd.{u1, u2} ι κ x)))) -> (Eq.{succ u3} α (HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) (tsum.{u3, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 ι (fun (x : ι) => f x)) (tsum.{u3, u2} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 κ (fun (y : κ) => g y))) (tsum.{u3, max u1 u2} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (Prod.{u1, u2} ι κ) (fun (z : Prod.{u1, u2} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) (f (Prod.fst.{u1, u2} ι κ z)) (g (Prod.snd.{u1, u2} ι κ z)))))
-but is expected to have type
- forall {ι : Type.{u2}} {κ : Type.{u1}} {α : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : T3Space.{u3} α _inst_1] [_inst_3 : NonUnitalNonAssocSemiring.{u3} α] [_inst_4 : TopologicalSemiring.{u3} α _inst_1 _inst_3] {f : ι -> α} {g : κ -> α}, (Summable.{u3, u2} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 f) -> (Summable.{u3, u1} α κ (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 g) -> (Summable.{u3, max u2 u1} α (Prod.{u2, u1} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u2, u1} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) (f (Prod.fst.{u2, u1} ι κ x)) (g (Prod.snd.{u2, u1} ι κ x)))) -> (Eq.{succ u3} α (HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) (tsum.{u3, u2} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 ι (fun (x : ι) => f x)) (tsum.{u3, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 κ (fun (y : κ) => g y))) (tsum.{u3, max u2 u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (Prod.{u2, u1} ι κ) (fun (z : Prod.{u2, u1} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) (f (Prod.fst.{u2, u1} ι κ z)) (g (Prod.snd.{u2, u1} ι κ z)))))
-Case conversion may be inaccurate. Consider using '#align tsum_mul_tsum tsum_mul_tsumₓ'. -/
/-- Product of two infinites sums indexed by arbitrary types.
See also `tsum_mul_tsum_of_summable_norm` if `f` and `g` are abolutely summable. -/
theorem tsum_mul_tsum (hf : Summable f) (hg : Summable g)
@@ -334,9 +202,6 @@ section cauchy_product
variable [TopologicalSpace α] [NonUnitalNonAssocSemiring α] {f g : ℕ → α}
-/- warning: summable_mul_prod_iff_summable_mul_sigma_antidiagonal -> summable_mul_prod_iff_summable_mul_sigma_antidiagonal is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align summable_mul_prod_iff_summable_mul_sigma_antidiagonal summable_mul_prod_iff_summable_mul_sigma_antidiagonalₓ'. -/
/- The family `(k, l) : ℕ × ℕ ↦ f k * g l` is summable if and only if the family
`(n, k, l) : Σ (n : ℕ), nat.antidiagonal n ↦ f k * g l` is summable. -/
theorem summable_mul_prod_iff_summable_mul_sigma_antidiagonal :
@@ -347,12 +212,6 @@ theorem summable_mul_prod_iff_summable_mul_sigma_antidiagonal :
variable [T3Space α] [TopologicalSemiring α]
-/- warning: summable_sum_mul_antidiagonal_of_summable_mul -> summable_sum_mul_antidiagonal_of_summable_mul is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (n : Nat) => Finset.sum.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.Nat.antidiagonal n) (fun (kl : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat kl)) (g (Prod.snd.{0, 0} Nat Nat kl)))))
-but is expected to have type
- forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (n : Nat) => Finset.sum.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.Nat.antidiagonal n) (fun (kl : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat kl)) (g (Prod.snd.{0, 0} Nat Nat kl)))))
-Case conversion may be inaccurate. Consider using '#align summable_sum_mul_antidiagonal_of_summable_mul summable_sum_mul_antidiagonal_of_summable_mulₓ'. -/
theorem summable_sum_mul_antidiagonal_of_summable_mul
(h : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
Summable fun n => ∑ kl in Nat.antidiagonal n, f kl.1 * g kl.2 :=
@@ -365,12 +224,6 @@ theorem summable_sum_mul_antidiagonal_of_summable_mul
exact h.sigma' fun n => (hasSum_fintype _).Summable
#align summable_sum_mul_antidiagonal_of_summable_mul summable_sum_mul_antidiagonal_of_summable_mul
-/- warning: tsum_mul_tsum_eq_tsum_sum_antidiagonal -> tsum_mul_tsum_eq_tsum_sum_antidiagonal is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 f) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 g) -> (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Eq.{succ u1} α (HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => f n)) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => g n))) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => Finset.sum.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.Nat.antidiagonal n) (fun (kl : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat kl)) (g (Prod.snd.{0, 0} Nat Nat kl))))))
-but is expected to have type
- forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 f) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 g) -> (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Eq.{succ u1} α (HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => f n)) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => g n))) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => Finset.sum.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.Nat.antidiagonal n) (fun (kl : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat kl)) (g (Prod.snd.{0, 0} Nat Nat kl))))))
-Case conversion may be inaccurate. Consider using '#align tsum_mul_tsum_eq_tsum_sum_antidiagonal tsum_mul_tsum_eq_tsum_sum_antidiagonalₓ'. -/
/-- The **Cauchy product formula** for the product of two infinites sums indexed by `ℕ`, expressed
by summing on `finset.nat.antidiagonal`.
@@ -390,12 +243,6 @@ theorem tsum_mul_tsum_eq_tsum_sum_antidiagonal (hf : Summable f) (hg : Summable
(summable_mul_prod_iff_summable_mul_sigma_antidiagonal.mp hfg)
#align tsum_mul_tsum_eq_tsum_sum_antidiagonal tsum_mul_tsum_eq_tsum_sum_antidiagonal
-/- warning: summable_sum_mul_range_of_summable_mul -> summable_sum_mul_range_of_summable_mul is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (n : Nat) => Finset.sum.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.range (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat Nat.hasAdd) n (OfNat.ofNat.{0} Nat 1 (OfNat.mk.{0} Nat 1 (One.one.{0} Nat Nat.hasOne))))) (fun (k : Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f k) (g (HSub.hSub.{0, 0, 0} Nat Nat Nat (instHSub.{0} Nat Nat.hasSub) n k)))))
-but is expected to have type
- forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (n : Nat) => Finset.sum.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.range (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat instAddNat) n (OfNat.ofNat.{0} Nat 1 (instOfNatNat 1)))) (fun (k : Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f k) (g (HSub.hSub.{0, 0, 0} Nat Nat Nat (instHSub.{0} Nat instSubNat) n k)))))
-Case conversion may be inaccurate. Consider using '#align summable_sum_mul_range_of_summable_mul summable_sum_mul_range_of_summable_mulₓ'. -/
theorem summable_sum_mul_range_of_summable_mul (h : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
Summable fun n => ∑ k in range (n + 1), f k * g (n - k) :=
by
@@ -403,12 +250,6 @@ theorem summable_sum_mul_range_of_summable_mul (h : Summable fun x : ℕ × ℕ
exact summable_sum_mul_antidiagonal_of_summable_mul h
#align summable_sum_mul_range_of_summable_mul summable_sum_mul_range_of_summable_mul
-/- warning: tsum_mul_tsum_eq_tsum_sum_range -> tsum_mul_tsum_eq_tsum_sum_range is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 f) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 g) -> (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Eq.{succ u1} α (HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => f n)) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => g n))) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => Finset.sum.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.range (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat Nat.hasAdd) n (OfNat.ofNat.{0} Nat 1 (OfNat.mk.{0} Nat 1 (One.one.{0} Nat Nat.hasOne))))) (fun (k : Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f k) (g (HSub.hSub.{0, 0, 0} Nat Nat Nat (instHSub.{0} Nat Nat.hasSub) n k))))))
-but is expected to have type
- forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 f) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 g) -> (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Eq.{succ u1} α (HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => f n)) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => g n))) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => Finset.sum.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.range (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat instAddNat) n (OfNat.ofNat.{0} Nat 1 (instOfNatNat 1)))) (fun (k : Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f k) (g (HSub.hSub.{0, 0, 0} Nat Nat Nat (instHSub.{0} Nat instSubNat) n k))))))
-Case conversion may be inaccurate. Consider using '#align tsum_mul_tsum_eq_tsum_sum_range tsum_mul_tsum_eq_tsum_sum_rangeₓ'. -/
/-- The **Cauchy product formula** for the product of two infinites sums indexed by `ℕ`, expressed
by summing on `finset.range`.
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -335,10 +335,7 @@ section cauchy_product
variable [TopologicalSpace α] [NonUnitalNonAssocSemiring α] {f g : ℕ → α}
/- warning: summable_mul_prod_iff_summable_mul_sigma_antidiagonal -> summable_mul_prod_iff_summable_mul_sigma_antidiagonal is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α}, Iff (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) (Summable.{u1, 0} α (Sigma.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Sigma.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n))) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat ((fun (a : Type) (b : Type) [self : HasLiftT.{1, 1} a b] => self.0) (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (HasLiftT.mk.{1, 1} (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (CoeTCₓ.coe.{1, 1} (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (coeBase.{1, 1} (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (coeSubtype.{1} (Prod.{0, 0} Nat Nat) (fun (x_1 : Prod.{0, 0} Nat Nat) => Membership.Mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.hasMem.{0} (Prod.{0, 0} Nat Nat)) x_1 (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))))))) (Sigma.snd.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x)))) (g (Prod.snd.{0, 0} Nat Nat ((fun (a : Type) (b : Type) [self : HasLiftT.{1, 1} a b] => self.0) (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (HasLiftT.mk.{1, 1} (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (CoeTCₓ.coe.{1, 1} (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (coeBase.{1, 1} (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (coeSubtype.{1} (Prod.{0, 0} Nat Nat) (fun (x_1 : Prod.{0, 0} Nat Nat) => Membership.Mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.hasMem.{0} (Prod.{0, 0} Nat Nat)) x_1 (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))))))) (Sigma.snd.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))))))
-but is expected to have type
- forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α}, Iff (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) (Summable.{u1, 0} α (Sigma.{0, 0} Nat (fun (n : Nat) => Subtype.{1} (Prod.{0, 0} Nat Nat) (fun (x : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x (Finset.Nat.antidiagonal n)))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Sigma.{0, 0} Nat (fun (n : Nat) => Subtype.{1} (Prod.{0, 0} Nat Nat) (fun (x : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x (Finset.Nat.antidiagonal n)))) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat (Subtype.val.{1} (Prod.{0, 0} Nat Nat) (fun (x_1 : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x_1 (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => Subtype.{1} (Prod.{0, 0} Nat Nat) (fun (x : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x (Finset.Nat.antidiagonal n))) x))) (Sigma.snd.{0, 0} Nat (fun (n : Nat) => Subtype.{1} (Prod.{0, 0} Nat Nat) (fun (x : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x (Finset.Nat.antidiagonal n))) x)))) (g (Prod.snd.{0, 0} Nat Nat (Subtype.val.{1} (Prod.{0, 0} Nat Nat) (fun (x_1 : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x_1 (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => Subtype.{1} (Prod.{0, 0} Nat Nat) (fun (x : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x (Finset.Nat.antidiagonal n))) x))) (Sigma.snd.{0, 0} Nat (fun (n : Nat) => Subtype.{1} (Prod.{0, 0} Nat Nat) (fun (x : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x (Finset.Nat.antidiagonal n))) x))))))
+<too large>
Case conversion may be inaccurate. Consider using '#align summable_mul_prod_iff_summable_mul_sigma_antidiagonal summable_mul_prod_iff_summable_mul_sigma_antidiagonalₓ'. -/
/- The family `(k, l) : ℕ × ℕ ↦ f k * g l` is summable if and only if the family
`(n, k, l) : Σ (n : ℕ), nat.antidiagonal n ↦ f k * g l` is summable. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/1a313d8bba1bad05faba71a4a4e9742ab5bd9efd
@@ -330,7 +330,7 @@ where the `n`-th term is a sum over all pairs `(k, l)` such that `k+l=n`, which
-/
-section CauchyProduct
+section cauchy_product
variable [TopologicalSpace α] [NonUnitalNonAssocSemiring α] {f g : ℕ → α}
@@ -425,5 +425,5 @@ theorem tsum_mul_tsum_eq_tsum_sum_range (hf : Summable f) (hg : Summable g)
exact tsum_mul_tsum_eq_tsum_sum_antidiagonal hf hg hfg
#align tsum_mul_tsum_eq_tsum_sum_range tsum_mul_tsum_eq_tsum_sum_range
-end CauchyProduct
+end cauchy_product
mathlib commit https://github.com/leanprover-community/mathlib/commit/3180fab693e2cee3bff62675571264cb8778b212
@@ -224,7 +224,7 @@ theorem tsum_mul_left [T2Space α] : (∑' x, a * f x) = a * ∑' x, f x :=
if ha : a = 0 then by simp [ha]
else by
rw [tsum_eq_zero_of_not_summable hf,
- tsum_eq_zero_of_not_summable (mt (summable_mul_left_iff ha).mp hf), mul_zero]
+ tsum_eq_zero_of_not_summable (mt (summable_mul_left_iff ha).mp hf), MulZeroClass.mul_zero]
#align tsum_mul_left tsum_mul_left
/- warning: tsum_mul_right -> tsum_mul_right is a dubious translation:
@@ -239,7 +239,7 @@ theorem tsum_mul_right [T2Space α] : (∑' x, f x * a) = (∑' x, f x) * a :=
if ha : a = 0 then by simp [ha]
else by
rw [tsum_eq_zero_of_not_summable hf,
- tsum_eq_zero_of_not_summable (mt (summable_mul_right_iff ha).mp hf), zero_mul]
+ tsum_eq_zero_of_not_summable (mt (summable_mul_right_iff ha).mp hf), MulZeroClass.zero_mul]
#align tsum_mul_right tsum_mul_right
/- warning: tsum_div_const -> tsum_div_const is a dubious translation:
mathlib commit https://github.com/leanprover-community/mathlib/commit/21e3562c5e12d846c7def5eff8cdbc520d7d4936
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
! This file was ported from Lean 3 source module topology.algebra.infinite_sum.ring
-! leanprover-community/mathlib commit 9a59dcb7a2d06bf55da57b9030169219980660cd
+! leanprover-community/mathlib commit f47581155c818e6361af4e4fda60d27d020c226b
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -15,6 +15,9 @@ import Mathbin.Topology.Algebra.Ring.Basic
/-!
# Infinite sum in a ring
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file provides lemmas about the interaction between infinite sums and multiplication.
## Main results
mathlib commit https://github.com/leanprover-community/mathlib/commit/641b6a82006416ec431b2987b354af9311fed4f2
@@ -34,18 +34,42 @@ section NonUnitalNonAssocSemiring
variable [NonUnitalNonAssocSemiring α] [TopologicalSpace α] [TopologicalSemiring α] {f g : ι → α}
{a a₁ a₂ : α}
+/- warning: has_sum.mul_left -> HasSum.mul_left is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} {a₁ : α} (a₂ : α), (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f a₁) -> (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) a₂ (f i)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) a₂ a₁))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} {a₁ : α} (a₂ : α), (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f a₁) -> (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) a₂ (f i)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) a₂ a₁))
+Case conversion may be inaccurate. Consider using '#align has_sum.mul_left HasSum.mul_leftₓ'. -/
theorem HasSum.mul_left (a₂) (h : HasSum f a₁) : HasSum (fun i => a₂ * f i) (a₂ * a₁) := by
simpa only using h.map (AddMonoidHom.mulLeft a₂) (continuous_const.mul continuous_id)
#align has_sum.mul_left HasSum.mul_left
+/- warning: has_sum.mul_right -> HasSum.mul_right is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} {a₁ : α} (a₂ : α), (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f a₁) -> (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) (f i) a₂) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) a₁ a₂))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} {a₁ : α} (a₂ : α), (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f a₁) -> (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) (f i) a₂) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) a₁ a₂))
+Case conversion may be inaccurate. Consider using '#align has_sum.mul_right HasSum.mul_rightₓ'. -/
theorem HasSum.mul_right (a₂) (hf : HasSum f a₁) : HasSum (fun i => f i * a₂) (a₁ * a₂) := by
simpa only using hf.map (AddMonoidHom.mulRight a₂) (continuous_id.mul continuous_const)
#align has_sum.mul_right HasSum.mul_right
+/- warning: summable.mul_left -> Summable.mul_left is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) a (f i)))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) a (f i)))
+Case conversion may be inaccurate. Consider using '#align summable.mul_left Summable.mul_leftₓ'. -/
theorem Summable.mul_left (a) (hf : Summable f) : Summable fun i => a * f i :=
(hf.HasSum.mulLeft _).Summable
#align summable.mul_left Summable.mul_left
+/- warning: summable.mul_right -> Summable.mul_right is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) (f i) a))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) (f i) a))
+Case conversion may be inaccurate. Consider using '#align summable.mul_right Summable.mul_rightₓ'. -/
theorem Summable.mul_right (a) (hf : Summable f) : Summable fun i => f i * a :=
(hf.HasSum.mulRight _).Summable
#align summable.mul_right Summable.mul_right
@@ -54,20 +78,44 @@ section tsum
variable [T2Space α]
+/- warning: summable.tsum_mul_left -> Summable.tsum_mul_left is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) a (f i))) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) a (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i))))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) a (f i))) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) a (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i))))
+Case conversion may be inaccurate. Consider using '#align summable.tsum_mul_left Summable.tsum_mul_leftₓ'. -/
theorem Summable.tsum_mul_left (a) (hf : Summable f) : (∑' i, a * f i) = a * ∑' i, f i :=
(hf.HasSum.mulLeft _).tsum_eq
#align summable.tsum_mul_left Summable.tsum_mul_left
+/- warning: summable.tsum_mul_right -> Summable.tsum_mul_right is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) (f i) a)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1))) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i)) a))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 f) -> (Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) (f i) a)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1)) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i)) a))
+Case conversion may be inaccurate. Consider using '#align summable.tsum_mul_right Summable.tsum_mul_rightₓ'. -/
theorem Summable.tsum_mul_right (a) (hf : Summable f) : (∑' i, f i * a) = (∑' i, f i) * a :=
(hf.HasSum.mulRight _).tsum_eq
#align summable.tsum_mul_right Summable.tsum_mul_right
+/- warning: commute.tsum_right -> Commute.tsum_right is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (forall (i : ι), Commute.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1)) a (f i)) -> (Commute.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1)) a (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i)))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (forall (i : ι), Commute.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1) a (f i)) -> (Commute.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1) a (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i)))
+Case conversion may be inaccurate. Consider using '#align commute.tsum_right Commute.tsum_rightₓ'. -/
theorem Commute.tsum_right (a) (h : ∀ i, Commute a (f i)) : Commute a (∑' i, f i) :=
if hf : Summable f then
(hf.tsum_mul_left a).symm.trans ((congr_arg _ <| funext h).trans (hf.tsum_mul_right a))
else (tsum_eq_zero_of_not_summable hf).symm ▸ Commute.zero_right _
#align commute.tsum_right Commute.tsum_right
+/- warning: commute.tsum_left -> Commute.tsum_left is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (forall (i : ι), Commute.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1)) (f i) a) -> (Commute.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α _inst_1)) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i)) a)
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 _inst_1] {f : ι -> α} [_inst_4 : T2Space.{u2} α _inst_2] (a : α), (forall (i : ι), Commute.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1) (f i) a) -> (Commute.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α _inst_1) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α _inst_1) _inst_2 ι (fun (i : ι) => f i)) a)
+Case conversion may be inaccurate. Consider using '#align commute.tsum_left Commute.tsum_leftₓ'. -/
theorem Commute.tsum_left (a) (h : ∀ i, Commute (f i) a) : Commute (∑' i, f i) a :=
(Commute.tsum_right _ fun i => (h i).symm).symm
#align commute.tsum_left Commute.tsum_left
@@ -81,38 +129,92 @@ section DivisionSemiring
variable [DivisionSemiring α] [TopologicalSpace α] [TopologicalSemiring α] {f g : ι → α}
{a a₁ a₂ : α}
+/- warning: has_sum.div_const -> HasSum.div_const is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a) -> (forall (b : α), HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) (f i) b) (HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) a b))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a) -> (forall (b : α), HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) (f i) b) (HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) a b))
+Case conversion may be inaccurate. Consider using '#align has_sum.div_const HasSum.div_constₓ'. -/
theorem HasSum.div_const (h : HasSum f a) (b : α) : HasSum (fun i => f i / b) (a / b) := by
simp only [div_eq_mul_inv, h.mul_right b⁻¹]
#align has_sum.div_const HasSum.div_const
+/- warning: summable.div_const -> Summable.div_const is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α}, (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f) -> (forall (b : α), Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) (f i) b))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α}, (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f) -> (forall (b : α), Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) (f i) b))
+Case conversion may be inaccurate. Consider using '#align summable.div_const Summable.div_constₓ'. -/
theorem Summable.div_const (h : Summable f) (b : α) : Summable fun i => f i / b :=
(h.HasSum.div_const _).Summable
#align summable.div_const Summable.div_const
+/- warning: has_sum_mul_left_iff -> hasSum_mul_left_iff is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a₁ : α} {a₂ : α}, (Ne.{succ u2} α a₂ (OfNat.ofNat.{u2} α 0 (OfNat.mk.{u2} α 0 (Zero.zero.{u2} α (MulZeroClass.toHasZero.{u2} α (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))))))) -> (Iff (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) a₂ (f i)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) a₂ a₁)) (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a₁))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a₁ : α} {a₂ : α}, (Ne.{succ u2} α a₂ (OfNat.ofNat.{u2} α 0 (Zero.toOfNat0.{u2} α (MonoidWithZero.toZero.{u2} α (Semiring.toMonoidWithZero.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) -> (Iff (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) a₂ (f i)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) a₂ a₁)) (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a₁))
+Case conversion may be inaccurate. Consider using '#align has_sum_mul_left_iff hasSum_mul_left_iffₓ'. -/
theorem hasSum_mul_left_iff (h : a₂ ≠ 0) : HasSum (fun i => a₂ * f i) (a₂ * a₁) ↔ HasSum f a₁ :=
⟨fun H => by simpa only [inv_mul_cancel_left₀ h] using H.mul_left a₂⁻¹, HasSum.mul_left _⟩
#align has_sum_mul_left_iff hasSum_mul_left_iff
+/- warning: has_sum_mul_right_iff -> hasSum_mul_right_iff is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a₁ : α} {a₂ : α}, (Ne.{succ u2} α a₂ (OfNat.ofNat.{u2} α 0 (OfNat.mk.{u2} α 0 (Zero.zero.{u2} α (MulZeroClass.toHasZero.{u2} α (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))))))) -> (Iff (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) (f i) a₂) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) a₁ a₂)) (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a₁))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a₁ : α} {a₂ : α}, (Ne.{succ u2} α a₂ (OfNat.ofNat.{u2} α 0 (Zero.toOfNat0.{u2} α (MonoidWithZero.toZero.{u2} α (Semiring.toMonoidWithZero.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) -> (Iff (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) (f i) a₂) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) a₁ a₂)) (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a₁))
+Case conversion may be inaccurate. Consider using '#align has_sum_mul_right_iff hasSum_mul_right_iffₓ'. -/
theorem hasSum_mul_right_iff (h : a₂ ≠ 0) : HasSum (fun i => f i * a₂) (a₁ * a₂) ↔ HasSum f a₁ :=
⟨fun H => by simpa only [mul_inv_cancel_right₀ h] using H.mul_right a₂⁻¹, HasSum.mul_right _⟩
#align has_sum_mul_right_iff hasSum_mul_right_iff
+/- warning: has_sum_div_const_iff -> hasSum_div_const_iff is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a₁ : α} {a₂ : α}, (Ne.{succ u2} α a₂ (OfNat.ofNat.{u2} α 0 (OfNat.mk.{u2} α 0 (Zero.zero.{u2} α (MulZeroClass.toHasZero.{u2} α (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))))))) -> (Iff (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) (f i) a₂) (HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) a₁ a₂)) (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a₁))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a₁ : α} {a₂ : α}, (Ne.{succ u2} α a₂ (OfNat.ofNat.{u2} α 0 (Zero.toOfNat0.{u2} α (MonoidWithZero.toZero.{u2} α (Semiring.toMonoidWithZero.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) -> (Iff (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) (f i) a₂) (HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) a₁ a₂)) (HasSum.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f a₁))
+Case conversion may be inaccurate. Consider using '#align has_sum_div_const_iff hasSum_div_const_iffₓ'. -/
theorem hasSum_div_const_iff (h : a₂ ≠ 0) : HasSum (fun i => f i / a₂) (a₁ / a₂) ↔ HasSum f a₁ := by
simpa only [div_eq_mul_inv] using hasSum_mul_right_iff (inv_ne_zero h)
#align has_sum_div_const_iff hasSum_div_const_iff
+/- warning: summable_mul_left_iff -> summable_mul_left_iff is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (Ne.{succ u2} α a (OfNat.ofNat.{u2} α 0 (OfNat.mk.{u2} α 0 (Zero.zero.{u2} α (MulZeroClass.toHasZero.{u2} α (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))))))) -> (Iff (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) a (f i))) (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (Ne.{succ u2} α a (OfNat.ofNat.{u2} α 0 (Zero.toOfNat0.{u2} α (MonoidWithZero.toZero.{u2} α (Semiring.toMonoidWithZero.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) -> (Iff (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) a (f i))) (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f))
+Case conversion may be inaccurate. Consider using '#align summable_mul_left_iff summable_mul_left_iffₓ'. -/
theorem summable_mul_left_iff (h : a ≠ 0) : (Summable fun i => a * f i) ↔ Summable f :=
⟨fun H => by simpa only [inv_mul_cancel_left₀ h] using H.mul_left a⁻¹, fun H => H.mulLeft _⟩
#align summable_mul_left_iff summable_mul_left_iff
+/- warning: summable_mul_right_iff -> summable_mul_right_iff is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (Ne.{succ u2} α a (OfNat.ofNat.{u2} α 0 (OfNat.mk.{u2} α 0 (Zero.zero.{u2} α (MulZeroClass.toHasZero.{u2} α (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))))))) -> (Iff (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) (f i) a)) (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (Ne.{succ u2} α a (OfNat.ofNat.{u2} α 0 (Zero.toOfNat0.{u2} α (MonoidWithZero.toZero.{u2} α (Semiring.toMonoidWithZero.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) -> (Iff (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) (f i) a)) (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f))
+Case conversion may be inaccurate. Consider using '#align summable_mul_right_iff summable_mul_right_iffₓ'. -/
theorem summable_mul_right_iff (h : a ≠ 0) : (Summable fun i => f i * a) ↔ Summable f :=
⟨fun H => by simpa only [mul_inv_cancel_right₀ h] using H.mul_right a⁻¹, fun H => H.mulRight _⟩
#align summable_mul_right_iff summable_mul_right_iff
+/- warning: summable_div_const_iff -> summable_div_const_iff is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (Ne.{succ u2} α a (OfNat.ofNat.{u2} α 0 (OfNat.mk.{u2} α 0 (Zero.zero.{u2} α (MulZeroClass.toHasZero.{u2} α (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))))))) -> (Iff (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) (f i) a)) (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α}, (Ne.{succ u2} α a (OfNat.ofNat.{u2} α 0 (Zero.toOfNat0.{u2} α (MonoidWithZero.toZero.{u2} α (Semiring.toMonoidWithZero.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) -> (Iff (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 (fun (i : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) (f i) a)) (Summable.{u2, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 f))
+Case conversion may be inaccurate. Consider using '#align summable_div_const_iff summable_div_const_iffₓ'. -/
theorem summable_div_const_iff (h : a ≠ 0) : (Summable fun i => f i / a) ↔ Summable f := by
simpa only [div_eq_mul_inv] using summable_mul_right_iff (inv_ne_zero h)
#align summable_div_const_iff summable_div_const_iff
+/- warning: tsum_mul_left -> tsum_mul_left is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α} [_inst_4 : T2Space.{u2} α _inst_2], Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) a (f x))) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) a (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => f x)))
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α} [_inst_4 : T2Space.{u2} α _inst_2], Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) a (f x))) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) a (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => f x)))
+Case conversion may be inaccurate. Consider using '#align tsum_mul_left tsum_mul_leftₓ'. -/
theorem tsum_mul_left [T2Space α] : (∑' x, a * f x) = a * ∑' x, f x :=
if hf : Summable f then hf.tsum_mul_left a
else
@@ -122,6 +224,12 @@ theorem tsum_mul_left [T2Space α] : (∑' x, a * f x) = a * ∑' x, f x :=
tsum_eq_zero_of_not_summable (mt (summable_mul_left_iff ha).mp hf), mul_zero]
#align tsum_mul_left tsum_mul_left
+/- warning: tsum_mul_right -> tsum_mul_right is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α} [_inst_4 : T2Space.{u2} α _inst_2], Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) (f x) a)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (Distrib.toHasMul.{u2} α (NonUnitalNonAssocSemiring.toDistrib.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))))) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => f x)) a)
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α} [_inst_4 : T2Space.{u2} α _inst_2], Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) (f x) a)) (HMul.hMul.{u2, u2, u2} α α α (instHMul.{u2} α (NonUnitalNonAssocSemiring.toMul.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1))))) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => f x)) a)
+Case conversion may be inaccurate. Consider using '#align tsum_mul_right tsum_mul_rightₓ'. -/
theorem tsum_mul_right [T2Space α] : (∑' x, f x * a) = (∑' x, f x) * a :=
if hf : Summable f then hf.tsum_mul_right a
else
@@ -131,6 +239,12 @@ theorem tsum_mul_right [T2Space α] : (∑' x, f x * a) = (∑' x, f x) * a :=
tsum_eq_zero_of_not_summable (mt (summable_mul_right_iff ha).mp hf), zero_mul]
#align tsum_mul_right tsum_mul_right
+/- warning: tsum_div_const -> tsum_div_const is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α} [_inst_4 : T2Space.{u2} α _inst_2], Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) (f x) a)) (HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivInvMonoid.toHasDiv.{u2} α (GroupWithZero.toDivInvMonoid.{u2} α (DivisionSemiring.toGroupWithZero.{u2} α _inst_1)))) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => f x)) a)
+but is expected to have type
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DivisionSemiring.{u2} α] [_inst_2 : TopologicalSpace.{u2} α] [_inst_3 : TopologicalSemiring.{u2} α _inst_2 (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))] {f : ι -> α} {a : α} [_inst_4 : T2Space.{u2} α _inst_2], Eq.{succ u2} α (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) (f x) a)) (HDiv.hDiv.{u2, u2, u2} α α α (instHDiv.{u2} α (DivisionSemiring.toDiv.{u2} α _inst_1)) (tsum.{u2, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} α (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} α (Semiring.toNonAssocSemiring.{u2} α (DivisionSemiring.toSemiring.{u2} α _inst_1)))) _inst_2 ι (fun (x : ι) => f x)) a)
+Case conversion may be inaccurate. Consider using '#align tsum_div_const tsum_div_constₓ'. -/
theorem tsum_div_const [T2Space α] : (∑' x, f x / a) = (∑' x, f x) / a := by
simpa only [div_eq_mul_inv] using tsum_mul_right
#align tsum_div_const tsum_div_const
@@ -158,6 +272,12 @@ section tsum_mul_tsum
variable [TopologicalSpace α] [T3Space α] [NonUnitalNonAssocSemiring α] [TopologicalSemiring α]
{f : ι → α} {g : κ → α} {s t u : α}
+/- warning: has_sum.mul_eq -> HasSum.mul_eq is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {κ : Type.{u2}} {α : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : T3Space.{u3} α _inst_1] [_inst_3 : NonUnitalNonAssocSemiring.{u3} α] [_inst_4 : TopologicalSemiring.{u3} α _inst_1 _inst_3] {f : ι -> α} {g : κ -> α} {s : α} {t : α} {u : α}, (HasSum.{u3, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 f s) -> (HasSum.{u3, u2} α κ (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 g t) -> (HasSum.{u3, max u1 u2} α (Prod.{u1, u2} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u1, u2} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) (f (Prod.fst.{u1, u2} ι κ x)) (g (Prod.snd.{u1, u2} ι κ x))) u) -> (Eq.{succ u3} α (HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) s t) u)
+but is expected to have type
+ forall {ι : Type.{u2}} {κ : Type.{u1}} {α : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : T3Space.{u3} α _inst_1] [_inst_3 : NonUnitalNonAssocSemiring.{u3} α] [_inst_4 : TopologicalSemiring.{u3} α _inst_1 _inst_3] {f : ι -> α} {g : κ -> α} {s : α} {t : α} {u : α}, (HasSum.{u3, u2} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 f s) -> (HasSum.{u3, u1} α κ (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 g t) -> (HasSum.{u3, max u2 u1} α (Prod.{u2, u1} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u2, u1} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) (f (Prod.fst.{u2, u1} ι κ x)) (g (Prod.snd.{u2, u1} ι κ x))) u) -> (Eq.{succ u3} α (HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) s t) u)
+Case conversion may be inaccurate. Consider using '#align has_sum.mul_eq HasSum.mul_eqₓ'. -/
theorem HasSum.mul_eq (hf : HasSum f s) (hg : HasSum g t)
(hfg : HasSum (fun x : ι × κ => f x.1 * g x.2) u) : s * t = u :=
have key₁ : HasSum (fun i => f i * t) (s * t) := hf.mulRight t
@@ -166,6 +286,12 @@ theorem HasSum.mul_eq (hf : HasSum f s) (hg : HasSum g t)
key₁.unique key₂
#align has_sum.mul_eq HasSum.mul_eq
+/- warning: has_sum.mul -> HasSum.mul is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {κ : Type.{u2}} {α : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : T3Space.{u3} α _inst_1] [_inst_3 : NonUnitalNonAssocSemiring.{u3} α] [_inst_4 : TopologicalSemiring.{u3} α _inst_1 _inst_3] {f : ι -> α} {g : κ -> α} {s : α} {t : α}, (HasSum.{u3, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 f s) -> (HasSum.{u3, u2} α κ (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 g t) -> (Summable.{u3, max u1 u2} α (Prod.{u1, u2} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u1, u2} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) (f (Prod.fst.{u1, u2} ι κ x)) (g (Prod.snd.{u1, u2} ι κ x)))) -> (HasSum.{u3, max u1 u2} α (Prod.{u1, u2} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u1, u2} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) (f (Prod.fst.{u1, u2} ι κ x)) (g (Prod.snd.{u1, u2} ι κ x))) (HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) s t))
+but is expected to have type
+ forall {ι : Type.{u2}} {κ : Type.{u1}} {α : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : T3Space.{u3} α _inst_1] [_inst_3 : NonUnitalNonAssocSemiring.{u3} α] [_inst_4 : TopologicalSemiring.{u3} α _inst_1 _inst_3] {f : ι -> α} {g : κ -> α} {s : α} {t : α}, (HasSum.{u3, u2} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 f s) -> (HasSum.{u3, u1} α κ (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 g t) -> (Summable.{u3, max u2 u1} α (Prod.{u2, u1} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u2, u1} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) (f (Prod.fst.{u2, u1} ι κ x)) (g (Prod.snd.{u2, u1} ι κ x)))) -> (HasSum.{u3, max u2 u1} α (Prod.{u2, u1} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u2, u1} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) (f (Prod.fst.{u2, u1} ι κ x)) (g (Prod.snd.{u2, u1} ι κ x))) (HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) s t))
+Case conversion may be inaccurate. Consider using '#align has_sum.mul HasSum.mulₓ'. -/
theorem HasSum.mul (hf : HasSum f s) (hg : HasSum g t)
(hfg : Summable fun x : ι × κ => f x.1 * g x.2) :
HasSum (fun x : ι × κ => f x.1 * g x.2) (s * t) :=
@@ -173,6 +299,12 @@ theorem HasSum.mul (hf : HasSum f s) (hg : HasSum g t)
(hf.mul_eq hg hu).symm ▸ hu
#align has_sum.mul HasSum.mul
+/- warning: tsum_mul_tsum -> tsum_mul_tsum is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {κ : Type.{u2}} {α : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : T3Space.{u3} α _inst_1] [_inst_3 : NonUnitalNonAssocSemiring.{u3} α] [_inst_4 : TopologicalSemiring.{u3} α _inst_1 _inst_3] {f : ι -> α} {g : κ -> α}, (Summable.{u3, u1} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 f) -> (Summable.{u3, u2} α κ (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 g) -> (Summable.{u3, max u1 u2} α (Prod.{u1, u2} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u1, u2} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) (f (Prod.fst.{u1, u2} ι κ x)) (g (Prod.snd.{u1, u2} ι κ x)))) -> (Eq.{succ u3} α (HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) (tsum.{u3, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 ι (fun (x : ι) => f x)) (tsum.{u3, u2} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 κ (fun (y : κ) => g y))) (tsum.{u3, max u1 u2} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (Prod.{u1, u2} ι κ) (fun (z : Prod.{u1, u2} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (Distrib.toHasMul.{u3} α (NonUnitalNonAssocSemiring.toDistrib.{u3} α _inst_3))) (f (Prod.fst.{u1, u2} ι κ z)) (g (Prod.snd.{u1, u2} ι κ z)))))
+but is expected to have type
+ forall {ι : Type.{u2}} {κ : Type.{u1}} {α : Type.{u3}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : T3Space.{u3} α _inst_1] [_inst_3 : NonUnitalNonAssocSemiring.{u3} α] [_inst_4 : TopologicalSemiring.{u3} α _inst_1 _inst_3] {f : ι -> α} {g : κ -> α}, (Summable.{u3, u2} α ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 f) -> (Summable.{u3, u1} α κ (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 g) -> (Summable.{u3, max u2 u1} α (Prod.{u2, u1} ι κ) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (fun (x : Prod.{u2, u1} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) (f (Prod.fst.{u2, u1} ι κ x)) (g (Prod.snd.{u2, u1} ι κ x)))) -> (Eq.{succ u3} α (HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) (tsum.{u3, u2} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 ι (fun (x : ι) => f x)) (tsum.{u3, u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 κ (fun (y : κ) => g y))) (tsum.{u3, max u2 u1} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} α _inst_3) _inst_1 (Prod.{u2, u1} ι κ) (fun (z : Prod.{u2, u1} ι κ) => HMul.hMul.{u3, u3, u3} α α α (instHMul.{u3} α (NonUnitalNonAssocSemiring.toMul.{u3} α _inst_3)) (f (Prod.fst.{u2, u1} ι κ z)) (g (Prod.snd.{u2, u1} ι κ z)))))
+Case conversion may be inaccurate. Consider using '#align tsum_mul_tsum tsum_mul_tsumₓ'. -/
/-- Product of two infinites sums indexed by arbitrary types.
See also `tsum_mul_tsum_of_summable_norm` if `f` and `g` are abolutely summable. -/
theorem tsum_mul_tsum (hf : Summable f) (hg : Summable g)
@@ -199,6 +331,12 @@ section CauchyProduct
variable [TopologicalSpace α] [NonUnitalNonAssocSemiring α] {f g : ℕ → α}
+/- warning: summable_mul_prod_iff_summable_mul_sigma_antidiagonal -> summable_mul_prod_iff_summable_mul_sigma_antidiagonal is a dubious translation:
+lean 3 declaration is
+ forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α}, Iff (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) (Summable.{u1, 0} α (Sigma.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Sigma.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n))) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat ((fun (a : Type) (b : Type) [self : HasLiftT.{1, 1} a b] => self.0) (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (HasLiftT.mk.{1, 1} (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (CoeTCₓ.coe.{1, 1} (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (coeBase.{1, 1} (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (coeSubtype.{1} (Prod.{0, 0} Nat Nat) (fun (x_1 : Prod.{0, 0} Nat Nat) => Membership.Mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.hasMem.{0} (Prod.{0, 0} Nat Nat)) x_1 (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))))))) (Sigma.snd.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x)))) (g (Prod.snd.{0, 0} Nat Nat ((fun (a : Type) (b : Type) [self : HasLiftT.{1, 1} a b] => self.0) (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (HasLiftT.mk.{1, 1} (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (CoeTCₓ.coe.{1, 1} (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (coeBase.{1, 1} (coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))) (Prod.{0, 0} Nat Nat) (coeSubtype.{1} (Prod.{0, 0} Nat Nat) (fun (x_1 : Prod.{0, 0} Nat Nat) => Membership.Mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.hasMem.{0} (Prod.{0, 0} Nat Nat)) x_1 (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))))))) (Sigma.snd.{0, 0} Nat (fun (n : Nat) => coeSort.{1, 2} (Finset.{0} (Prod.{0, 0} Nat Nat)) Type (Finset.hasCoeToSort.{0} (Prod.{0, 0} Nat Nat)) (Finset.Nat.antidiagonal n)) x))))))
+but is expected to have type
+ forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α}, Iff (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) (Summable.{u1, 0} α (Sigma.{0, 0} Nat (fun (n : Nat) => Subtype.{1} (Prod.{0, 0} Nat Nat) (fun (x : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x (Finset.Nat.antidiagonal n)))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Sigma.{0, 0} Nat (fun (n : Nat) => Subtype.{1} (Prod.{0, 0} Nat Nat) (fun (x : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x (Finset.Nat.antidiagonal n)))) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat (Subtype.val.{1} (Prod.{0, 0} Nat Nat) (fun (x_1 : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x_1 (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => Subtype.{1} (Prod.{0, 0} Nat Nat) (fun (x : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x (Finset.Nat.antidiagonal n))) x))) (Sigma.snd.{0, 0} Nat (fun (n : Nat) => Subtype.{1} (Prod.{0, 0} Nat Nat) (fun (x : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x (Finset.Nat.antidiagonal n))) x)))) (g (Prod.snd.{0, 0} Nat Nat (Subtype.val.{1} (Prod.{0, 0} Nat Nat) (fun (x_1 : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x_1 (Finset.Nat.antidiagonal (Sigma.fst.{0, 0} Nat (fun (n : Nat) => Subtype.{1} (Prod.{0, 0} Nat Nat) (fun (x : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x (Finset.Nat.antidiagonal n))) x))) (Sigma.snd.{0, 0} Nat (fun (n : Nat) => Subtype.{1} (Prod.{0, 0} Nat Nat) (fun (x : Prod.{0, 0} Nat Nat) => Membership.mem.{0, 0} (Prod.{0, 0} Nat Nat) (Finset.{0} (Prod.{0, 0} Nat Nat)) (Finset.instMembershipFinset.{0} (Prod.{0, 0} Nat Nat)) x (Finset.Nat.antidiagonal n))) x))))))
+Case conversion may be inaccurate. Consider using '#align summable_mul_prod_iff_summable_mul_sigma_antidiagonal summable_mul_prod_iff_summable_mul_sigma_antidiagonalₓ'. -/
/- The family `(k, l) : ℕ × ℕ ↦ f k * g l` is summable if and only if the family
`(n, k, l) : Σ (n : ℕ), nat.antidiagonal n ↦ f k * g l` is summable. -/
theorem summable_mul_prod_iff_summable_mul_sigma_antidiagonal :
@@ -209,6 +347,12 @@ theorem summable_mul_prod_iff_summable_mul_sigma_antidiagonal :
variable [T3Space α] [TopologicalSemiring α]
+/- warning: summable_sum_mul_antidiagonal_of_summable_mul -> summable_sum_mul_antidiagonal_of_summable_mul is a dubious translation:
+lean 3 declaration is
+ forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (n : Nat) => Finset.sum.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.Nat.antidiagonal n) (fun (kl : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat kl)) (g (Prod.snd.{0, 0} Nat Nat kl)))))
+but is expected to have type
+ forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (n : Nat) => Finset.sum.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.Nat.antidiagonal n) (fun (kl : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat kl)) (g (Prod.snd.{0, 0} Nat Nat kl)))))
+Case conversion may be inaccurate. Consider using '#align summable_sum_mul_antidiagonal_of_summable_mul summable_sum_mul_antidiagonal_of_summable_mulₓ'. -/
theorem summable_sum_mul_antidiagonal_of_summable_mul
(h : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
Summable fun n => ∑ kl in Nat.antidiagonal n, f kl.1 * g kl.2 :=
@@ -221,6 +365,12 @@ theorem summable_sum_mul_antidiagonal_of_summable_mul
exact h.sigma' fun n => (hasSum_fintype _).Summable
#align summable_sum_mul_antidiagonal_of_summable_mul summable_sum_mul_antidiagonal_of_summable_mul
+/- warning: tsum_mul_tsum_eq_tsum_sum_antidiagonal -> tsum_mul_tsum_eq_tsum_sum_antidiagonal is a dubious translation:
+lean 3 declaration is
+ forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 f) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 g) -> (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Eq.{succ u1} α (HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => f n)) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => g n))) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => Finset.sum.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.Nat.antidiagonal n) (fun (kl : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat kl)) (g (Prod.snd.{0, 0} Nat Nat kl))))))
+but is expected to have type
+ forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 f) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 g) -> (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Eq.{succ u1} α (HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => f n)) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => g n))) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => Finset.sum.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.Nat.antidiagonal n) (fun (kl : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat kl)) (g (Prod.snd.{0, 0} Nat Nat kl))))))
+Case conversion may be inaccurate. Consider using '#align tsum_mul_tsum_eq_tsum_sum_antidiagonal tsum_mul_tsum_eq_tsum_sum_antidiagonalₓ'. -/
/-- The **Cauchy product formula** for the product of two infinites sums indexed by `ℕ`, expressed
by summing on `finset.nat.antidiagonal`.
@@ -240,6 +390,12 @@ theorem tsum_mul_tsum_eq_tsum_sum_antidiagonal (hf : Summable f) (hg : Summable
(summable_mul_prod_iff_summable_mul_sigma_antidiagonal.mp hfg)
#align tsum_mul_tsum_eq_tsum_sum_antidiagonal tsum_mul_tsum_eq_tsum_sum_antidiagonal
+/- warning: summable_sum_mul_range_of_summable_mul -> summable_sum_mul_range_of_summable_mul is a dubious translation:
+lean 3 declaration is
+ forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (n : Nat) => Finset.sum.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.range (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat Nat.hasAdd) n (OfNat.ofNat.{0} Nat 1 (OfNat.mk.{0} Nat 1 (One.one.{0} Nat Nat.hasOne))))) (fun (k : Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f k) (g (HSub.hSub.{0, 0, 0} Nat Nat Nat (instHSub.{0} Nat Nat.hasSub) n k)))))
+but is expected to have type
+ forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (n : Nat) => Finset.sum.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.range (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat instAddNat) n (OfNat.ofNat.{0} Nat 1 (instOfNatNat 1)))) (fun (k : Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f k) (g (HSub.hSub.{0, 0, 0} Nat Nat Nat (instHSub.{0} Nat instSubNat) n k)))))
+Case conversion may be inaccurate. Consider using '#align summable_sum_mul_range_of_summable_mul summable_sum_mul_range_of_summable_mulₓ'. -/
theorem summable_sum_mul_range_of_summable_mul (h : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
Summable fun n => ∑ k in range (n + 1), f k * g (n - k) :=
by
@@ -247,6 +403,12 @@ theorem summable_sum_mul_range_of_summable_mul (h : Summable fun x : ℕ × ℕ
exact summable_sum_mul_antidiagonal_of_summable_mul h
#align summable_sum_mul_range_of_summable_mul summable_sum_mul_range_of_summable_mul
+/- warning: tsum_mul_tsum_eq_tsum_sum_range -> tsum_mul_tsum_eq_tsum_sum_range is a dubious translation:
+lean 3 declaration is
+ forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 f) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 g) -> (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Eq.{succ u1} α (HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => f n)) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => g n))) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => Finset.sum.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.range (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat Nat.hasAdd) n (OfNat.ofNat.{0} Nat 1 (OfNat.mk.{0} Nat 1 (One.one.{0} Nat Nat.hasOne))))) (fun (k : Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (Distrib.toHasMul.{u1} α (NonUnitalNonAssocSemiring.toDistrib.{u1} α _inst_2))) (f k) (g (HSub.hSub.{0, 0, 0} Nat Nat Nat (instHSub.{0} Nat Nat.hasSub) n k))))))
+but is expected to have type
+ forall {α : Type.{u1}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : NonUnitalNonAssocSemiring.{u1} α] {f : Nat -> α} {g : Nat -> α} [_inst_3 : T3Space.{u1} α _inst_1] [_inst_4 : TopologicalSemiring.{u1} α _inst_1 _inst_2], (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 f) -> (Summable.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 g) -> (Summable.{u1, 0} α (Prod.{0, 0} Nat Nat) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 (fun (x : Prod.{0, 0} Nat Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f (Prod.fst.{0, 0} Nat Nat x)) (g (Prod.snd.{0, 0} Nat Nat x)))) -> (Eq.{succ u1} α (HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => f n)) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => g n))) (tsum.{u1, 0} α (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) _inst_1 Nat (fun (n : Nat) => Finset.sum.{u1, 0} α Nat (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} α _inst_2) (Finset.range (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat instAddNat) n (OfNat.ofNat.{0} Nat 1 (instOfNatNat 1)))) (fun (k : Nat) => HMul.hMul.{u1, u1, u1} α α α (instHMul.{u1} α (NonUnitalNonAssocSemiring.toMul.{u1} α _inst_2)) (f k) (g (HSub.hSub.{0, 0, 0} Nat Nat Nat (instHSub.{0} Nat instSubNat) n k))))))
+Case conversion may be inaccurate. Consider using '#align tsum_mul_tsum_eq_tsum_sum_range tsum_mul_tsum_eq_tsum_sum_rangeₓ'. -/
/-- The **Cauchy product formula** for the product of two infinites sums indexed by `ℕ`, expressed
by summing on `finset.range`.
mathlib commit https://github.com/leanprover-community/mathlib/commit/62e8311c791f02c47451bf14aa2501048e7c2f33
@@ -4,12 +4,13 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
! This file was ported from Lean 3 source module topology.algebra.infinite_sum.ring
-! leanprover-community/mathlib commit 32253a1a1071173b33dc7d6a218cf722c6feb514
+! leanprover-community/mathlib commit 9a59dcb7a2d06bf55da57b9030169219980660cd
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
+import Mathbin.Algebra.BigOperators.NatAntidiagonal
import Mathbin.Topology.Algebra.InfiniteSum.Basic
-import Mathbin.Topology.Algebra.Ring
+import Mathbin.Topology.Algebra.Ring.Basic
/-!
# Infinite sum in a ring
@@ -42,11 +43,11 @@ theorem HasSum.mul_right (a₂) (hf : HasSum f a₁) : HasSum (fun i => f i * a
#align has_sum.mul_right HasSum.mul_right
theorem Summable.mul_left (a) (hf : Summable f) : Summable fun i => a * f i :=
- (hf.HasSum.mul_left _).Summable
+ (hf.HasSum.mulLeft _).Summable
#align summable.mul_left Summable.mul_left
theorem Summable.mul_right (a) (hf : Summable f) : Summable fun i => f i * a :=
- (hf.HasSum.mul_right _).Summable
+ (hf.HasSum.mulRight _).Summable
#align summable.mul_right Summable.mul_right
section tsum
@@ -54,11 +55,11 @@ section tsum
variable [T2Space α]
theorem Summable.tsum_mul_left (a) (hf : Summable f) : (∑' i, a * f i) = a * ∑' i, f i :=
- (hf.HasSum.mul_left _).tsum_eq
+ (hf.HasSum.mulLeft _).tsum_eq
#align summable.tsum_mul_left Summable.tsum_mul_left
theorem Summable.tsum_mul_right (a) (hf : Summable f) : (∑' i, f i * a) = (∑' i, f i) * a :=
- (hf.HasSum.mul_right _).tsum_eq
+ (hf.HasSum.mulRight _).tsum_eq
#align summable.tsum_mul_right Summable.tsum_mul_right
theorem Commute.tsum_right (a) (h : ∀ i, Commute a (f i)) : Commute a (∑' i, f i) :=
@@ -101,11 +102,11 @@ theorem hasSum_div_const_iff (h : a₂ ≠ 0) : HasSum (fun i => f i / a₂) (a
#align has_sum_div_const_iff hasSum_div_const_iff
theorem summable_mul_left_iff (h : a ≠ 0) : (Summable fun i => a * f i) ↔ Summable f :=
- ⟨fun H => by simpa only [inv_mul_cancel_left₀ h] using H.mul_left a⁻¹, fun H => H.mul_left _⟩
+ ⟨fun H => by simpa only [inv_mul_cancel_left₀ h] using H.mul_left a⁻¹, fun H => H.mulLeft _⟩
#align summable_mul_left_iff summable_mul_left_iff
theorem summable_mul_right_iff (h : a ≠ 0) : (Summable fun i => f i * a) ↔ Summable f :=
- ⟨fun H => by simpa only [mul_inv_cancel_right₀ h] using H.mul_right a⁻¹, fun H => H.mul_right _⟩
+ ⟨fun H => by simpa only [mul_inv_cancel_right₀ h] using H.mul_right a⁻¹, fun H => H.mulRight _⟩
#align summable_mul_right_iff summable_mul_right_iff
theorem summable_div_const_iff (h : a ≠ 0) : (Summable fun i => f i / a) ↔ Summable f := by
@@ -159,8 +160,8 @@ variable [TopologicalSpace α] [T3Space α] [NonUnitalNonAssocSemiring α] [Topo
theorem HasSum.mul_eq (hf : HasSum f s) (hg : HasSum g t)
(hfg : HasSum (fun x : ι × κ => f x.1 * g x.2) u) : s * t = u :=
- have key₁ : HasSum (fun i => f i * t) (s * t) := hf.mul_right t
- have this : ∀ i : ι, HasSum (fun c : κ => f i * g c) (f i * t) := fun i => hg.mul_left (f i)
+ have key₁ : HasSum (fun i => f i * t) (s * t) := hf.mulRight t
+ have this : ∀ i : ι, HasSum (fun c : κ => f i * g c) (f i * t) := fun i => hg.mulLeft (f i)
have key₂ : HasSum (fun i => f i * t) u := HasSum.prod_fiberwise hfg this
key₁.unique key₂
#align has_sum.mul_eq HasSum.mul_eq
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
All of these changes appear to be oversights to me.
@@ -196,7 +196,7 @@ section HasAntidiagonal
variable {A : Type*} [AddCommMonoid A] [HasAntidiagonal A]
variable [TopologicalSpace α] [NonUnitalNonAssocSemiring α] {f g : A → α}
-/- The family `(k, l) : ℕ × ℕ ↦ f k * g l` is summable if and only if the family
+/-- The family `(k, l) : ℕ × ℕ ↦ f k * g l` is summable if and only if the family
`(n, k, l) : Σ (n : ℕ), antidiagonal n ↦ f k * g l` is summable. -/
theorem summable_mul_prod_iff_summable_mul_sigma_antidiagonal :
(Summable fun x : A × A ↦ f x.1 * g x.2) ↔
open Classical
(#11199)
We remove all but one open Classical
s, instead preferring to use open scoped Classical
. The only real side-effect this led to is moving a couple declarations to use Exists.choose
instead of Classical.choose
.
The first few commits are explicitly labelled regex replaces for ease of review.
@@ -22,7 +22,8 @@ This file provides lemmas about the interaction between infinite sums and multip
open Filter Finset Function
-open BigOperators Classical
+open scoped Classical
+open BigOperators
variable {ι κ R α : Type*}
Split up Mathlib.Topology.Algebra.InfiniteSum.Basic
(1600 lines) into smaller files.
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
-/
import Mathlib.Algebra.BigOperators.NatAntidiagonal
-import Mathlib.Topology.Algebra.InfiniteSum.Basic
+import Mathlib.Topology.Algebra.InfiniteSum.Constructions
import Mathlib.Topology.Algebra.Ring.Basic
#align_import topology.algebra.infinite_sum.ring from "leanprover-community/mathlib"@"9a59dcb7a2d06bf55da57b9030169219980660cd"
@@ -31,19 +31,19 @@ section NonUnitalNonAssocSemiring
variable [NonUnitalNonAssocSemiring α] [TopologicalSpace α] [TopologicalSemiring α] {f g : ι → α}
{a a₁ a₂ : α}
-theorem HasSum.mul_left (a₂) (h : HasSum f a₁) : HasSum (fun i => a₂ * f i) (a₂ * a₁) := by
+theorem HasSum.mul_left (a₂) (h : HasSum f a₁) : HasSum (fun i ↦ a₂ * f i) (a₂ * a₁) := by
simpa only using h.map (AddMonoidHom.mulLeft a₂) (continuous_const.mul continuous_id)
#align has_sum.mul_left HasSum.mul_left
-theorem HasSum.mul_right (a₂) (hf : HasSum f a₁) : HasSum (fun i => f i * a₂) (a₁ * a₂) := by
+theorem HasSum.mul_right (a₂) (hf : HasSum f a₁) : HasSum (fun i ↦ f i * a₂) (a₁ * a₂) := by
simpa only using hf.map (AddMonoidHom.mulRight a₂) (continuous_id.mul continuous_const)
#align has_sum.mul_right HasSum.mul_right
-theorem Summable.mul_left (a) (hf : Summable f) : Summable fun i => a * f i :=
+theorem Summable.mul_left (a) (hf : Summable f) : Summable fun i ↦ a * f i :=
(hf.hasSum.mul_left _).summable
#align summable.mul_left Summable.mul_left
-theorem Summable.mul_right (a) (hf : Summable f) : Summable fun i => f i * a :=
+theorem Summable.mul_right (a) (hf : Summable f) : Summable fun i ↦ f i * a :=
(hf.hasSum.mul_right _).summable
#align summable.mul_right Summable.mul_right
@@ -66,7 +66,7 @@ theorem Commute.tsum_right (a) (h : ∀ i, Commute a (f i)) : Commute a (∑' i,
#align commute.tsum_right Commute.tsum_right
theorem Commute.tsum_left (a) (h : ∀ i, Commute (f i) a) : Commute (∑' i, f i) a :=
- (Commute.tsum_right _ fun i => (h i).symm).symm
+ (Commute.tsum_right _ fun i ↦ (h i).symm).symm
#align commute.tsum_left Commute.tsum_left
end tsum
@@ -78,35 +78,35 @@ section DivisionSemiring
variable [DivisionSemiring α] [TopologicalSpace α] [TopologicalSemiring α] {f g : ι → α}
{a a₁ a₂ : α}
-theorem HasSum.div_const (h : HasSum f a) (b : α) : HasSum (fun i => f i / b) (a / b) := by
+theorem HasSum.div_const (h : HasSum f a) (b : α) : HasSum (fun i ↦ f i / b) (a / b) := by
simp only [div_eq_mul_inv, h.mul_right b⁻¹]
#align has_sum.div_const HasSum.div_const
-theorem Summable.div_const (h : Summable f) (b : α) : Summable fun i => f i / b :=
+theorem Summable.div_const (h : Summable f) (b : α) : Summable fun i ↦ f i / b :=
(h.hasSum.div_const _).summable
#align summable.div_const Summable.div_const
-theorem hasSum_mul_left_iff (h : a₂ ≠ 0) : HasSum (fun i => a₂ * f i) (a₂ * a₁) ↔ HasSum f a₁ :=
- ⟨fun H => by simpa only [inv_mul_cancel_left₀ h] using H.mul_left a₂⁻¹, HasSum.mul_left _⟩
+theorem hasSum_mul_left_iff (h : a₂ ≠ 0) : HasSum (fun i ↦ a₂ * f i) (a₂ * a₁) ↔ HasSum f a₁ :=
+ ⟨fun H ↦ by simpa only [inv_mul_cancel_left₀ h] using H.mul_left a₂⁻¹, HasSum.mul_left _⟩
#align has_sum_mul_left_iff hasSum_mul_left_iff
-theorem hasSum_mul_right_iff (h : a₂ ≠ 0) : HasSum (fun i => f i * a₂) (a₁ * a₂) ↔ HasSum f a₁ :=
- ⟨fun H => by simpa only [mul_inv_cancel_right₀ h] using H.mul_right a₂⁻¹, HasSum.mul_right _⟩
+theorem hasSum_mul_right_iff (h : a₂ ≠ 0) : HasSum (fun i ↦ f i * a₂) (a₁ * a₂) ↔ HasSum f a₁ :=
+ ⟨fun H ↦ by simpa only [mul_inv_cancel_right₀ h] using H.mul_right a₂⁻¹, HasSum.mul_right _⟩
#align has_sum_mul_right_iff hasSum_mul_right_iff
-theorem hasSum_div_const_iff (h : a₂ ≠ 0) : HasSum (fun i => f i / a₂) (a₁ / a₂) ↔ HasSum f a₁ := by
+theorem hasSum_div_const_iff (h : a₂ ≠ 0) : HasSum (fun i ↦ f i / a₂) (a₁ / a₂) ↔ HasSum f a₁ := by
simpa only [div_eq_mul_inv] using hasSum_mul_right_iff (inv_ne_zero h)
#align has_sum_div_const_iff hasSum_div_const_iff
-theorem summable_mul_left_iff (h : a ≠ 0) : (Summable fun i => a * f i) ↔ Summable f :=
- ⟨fun H => by simpa only [inv_mul_cancel_left₀ h] using H.mul_left a⁻¹, fun H => H.mul_left _⟩
+theorem summable_mul_left_iff (h : a ≠ 0) : (Summable fun i ↦ a * f i) ↔ Summable f :=
+ ⟨fun H ↦ by simpa only [inv_mul_cancel_left₀ h] using H.mul_left a⁻¹, fun H ↦ H.mul_left _⟩
#align summable_mul_left_iff summable_mul_left_iff
-theorem summable_mul_right_iff (h : a ≠ 0) : (Summable fun i => f i * a) ↔ Summable f :=
- ⟨fun H => by simpa only [mul_inv_cancel_right₀ h] using H.mul_right a⁻¹, fun H => H.mul_right _⟩
+theorem summable_mul_right_iff (h : a ≠ 0) : (Summable fun i ↦ f i * a) ↔ Summable f :=
+ ⟨fun H ↦ by simpa only [mul_inv_cancel_right₀ h] using H.mul_right a⁻¹, fun H ↦ H.mul_right _⟩
#align summable_mul_right_iff summable_mul_right_iff
-theorem summable_div_const_iff (h : a ≠ 0) : (Summable fun i => f i / a) ↔ Summable f := by
+theorem summable_div_const_iff (h : a ≠ 0) : (Summable fun i ↦ f i / a) ↔ Summable f := by
simpa only [div_eq_mul_inv] using summable_mul_right_iff (inv_ne_zero h)
#align summable_div_const_iff summable_div_const_iff
@@ -131,7 +131,7 @@ theorem tsum_div_const [T2Space α] : ∑' x, f x / a = (∑' x, f x) / a := by
end DivisionSemiring
/-!
-### Multipliying two infinite sums
+### Multiplying two infinite sums
In this section, we prove various results about `(∑' x : ι, f x) * (∑' y : κ, g y)`. Note that we
always assume that the family `fun x : ι × κ ↦ f x.1 * g x.2` is summable, since there is no way to
@@ -152,16 +152,16 @@ variable [TopologicalSpace α] [T3Space α] [NonUnitalNonAssocSemiring α] [Topo
{f : ι → α} {g : κ → α} {s t u : α}
theorem HasSum.mul_eq (hf : HasSum f s) (hg : HasSum g t)
- (hfg : HasSum (fun x : ι × κ => f x.1 * g x.2) u) : s * t = u :=
- have key₁ : HasSum (fun i => f i * t) (s * t) := hf.mul_right t
- have this : ∀ i : ι, HasSum (fun c : κ => f i * g c) (f i * t) := fun i => hg.mul_left (f i)
- have key₂ : HasSum (fun i => f i * t) u := HasSum.prod_fiberwise hfg this
+ (hfg : HasSum (fun x : ι × κ ↦ f x.1 * g x.2) u) : s * t = u :=
+ have key₁ : HasSum (fun i ↦ f i * t) (s * t) := hf.mul_right t
+ have this : ∀ i : ι, HasSum (fun c : κ ↦ f i * g c) (f i * t) := fun i ↦ hg.mul_left (f i)
+ have key₂ : HasSum (fun i ↦ f i * t) u := HasSum.prod_fiberwise hfg this
key₁.unique key₂
#align has_sum.mul_eq HasSum.mul_eq
theorem HasSum.mul (hf : HasSum f s) (hg : HasSum g t)
- (hfg : Summable fun x : ι × κ => f x.1 * g x.2) :
- HasSum (fun x : ι × κ => f x.1 * g x.2) (s * t) :=
+ (hfg : Summable fun x : ι × κ ↦ f x.1 * g x.2) :
+ HasSum (fun x : ι × κ ↦ f x.1 * g x.2) (s * t) :=
let ⟨_u, hu⟩ := hfg
(hf.mul_eq hg hu).symm ▸ hu
#align has_sum.mul HasSum.mul
@@ -169,7 +169,7 @@ theorem HasSum.mul (hf : HasSum f s) (hg : HasSum g t)
/-- Product of two infinites sums indexed by arbitrary types.
See also `tsum_mul_tsum_of_summable_norm` if `f` and `g` are absolutely summable. -/
theorem tsum_mul_tsum (hf : Summable f) (hg : Summable g)
- (hfg : Summable fun x : ι × κ => f x.1 * g x.2) :
+ (hfg : Summable fun x : ι × κ ↦ f x.1 * g x.2) :
((∑' x, f x) * ∑' y, g y) = ∑' z : ι × κ, f z.1 * g z.2 :=
hf.hasSum.mul_eq hg.hasSum hfg.hasSum
#align tsum_mul_tsum tsum_mul_tsum
@@ -198,19 +198,19 @@ variable [TopologicalSpace α] [NonUnitalNonAssocSemiring α] {f g : A → α}
/- The family `(k, l) : ℕ × ℕ ↦ f k * g l` is summable if and only if the family
`(n, k, l) : Σ (n : ℕ), antidiagonal n ↦ f k * g l` is summable. -/
theorem summable_mul_prod_iff_summable_mul_sigma_antidiagonal :
- (Summable fun x : A × A => f x.1 * g x.2) ↔
- Summable fun x : Σn : A, antidiagonal n => f (x.2 : A × A).1 * g (x.2 : A × A).2 :=
+ (Summable fun x : A × A ↦ f x.1 * g x.2) ↔
+ Summable fun x : Σn : A, antidiagonal n ↦ f (x.2 : A × A).1 * g (x.2 : A × A).2 :=
Finset.sigmaAntidiagonalEquivProd.summable_iff.symm
#align summable_mul_prod_iff_summable_mul_sigma_antidiagonal summable_mul_prod_iff_summable_mul_sigma_antidiagonal
variable [T3Space α] [TopologicalSemiring α]
theorem summable_sum_mul_antidiagonal_of_summable_mul
- (h : Summable fun x : A × A => f x.1 * g x.2) :
- Summable fun n => ∑ kl in antidiagonal n, f kl.1 * g kl.2 := by
+ (h : Summable fun x : A × A ↦ f x.1 * g x.2) :
+ Summable fun n ↦ ∑ kl in antidiagonal n, f kl.1 * g kl.2 := by
rw [summable_mul_prod_iff_summable_mul_sigma_antidiagonal] at h
conv => congr; ext; rw [← Finset.sum_finset_coe, ← tsum_fintype]
- exact h.sigma' fun n => (hasSum_fintype _).summable
+ exact h.sigma' fun n ↦ (hasSum_fintype _).summable
#align summable_sum_mul_antidiagonal_of_summable_mul summable_sum_mul_antidiagonal_of_summable_mul
/-- The **Cauchy product formula** for the product of two infinites sums indexed by `ℕ`, expressed
@@ -219,12 +219,12 @@ by summing on `Finset.antidiagonal`.
See also `tsum_mul_tsum_eq_tsum_sum_antidiagonal_of_summable_norm` if `f` and `g` are absolutely
summable. -/
theorem tsum_mul_tsum_eq_tsum_sum_antidiagonal (hf : Summable f) (hg : Summable g)
- (hfg : Summable fun x : A × A => f x.1 * g x.2) :
+ (hfg : Summable fun x : A × A ↦ f x.1 * g x.2) :
((∑' n, f n) * ∑' n, g n) = ∑' n, ∑ kl in antidiagonal n, f kl.1 * g kl.2 := by
conv_rhs => congr; ext; rw [← Finset.sum_finset_coe, ← tsum_fintype]
rw [tsum_mul_tsum hf hg hfg, ← sigmaAntidiagonalEquivProd.tsum_eq (_ : A × A → α)]
exact
- tsum_sigma' (fun n => (hasSum_fintype _).summable)
+ tsum_sigma' (fun n ↦ (hasSum_fintype _).summable)
(summable_mul_prod_iff_summable_mul_sigma_antidiagonal.mp hfg)
#align tsum_mul_tsum_eq_tsum_sum_antidiagonal tsum_mul_tsum_eq_tsum_sum_antidiagonal
@@ -235,9 +235,9 @@ section Nat
variable [TopologicalSpace α] [NonUnitalNonAssocSemiring α] {f g : ℕ → α}
variable [T3Space α] [TopologicalSemiring α]
-theorem summable_sum_mul_range_of_summable_mul (h : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
- Summable fun n => ∑ k in range (n + 1), f k * g (n - k) := by
- simp_rw [← Nat.sum_antidiagonal_eq_sum_range_succ fun k l => f k * g l]
+theorem summable_sum_mul_range_of_summable_mul (h : Summable fun x : ℕ × ℕ ↦ f x.1 * g x.2) :
+ Summable fun n ↦ ∑ k in range (n + 1), f k * g (n - k) := by
+ simp_rw [← Nat.sum_antidiagonal_eq_sum_range_succ fun k l ↦ f k * g l]
exact summable_sum_mul_antidiagonal_of_summable_mul h
#align summable_sum_mul_range_of_summable_mul summable_sum_mul_range_of_summable_mul
@@ -247,9 +247,9 @@ by summing on `Finset.range`.
See also `tsum_mul_tsum_eq_tsum_sum_range_of_summable_norm` if `f` and `g` are absolutely summable.
-/
theorem tsum_mul_tsum_eq_tsum_sum_range (hf : Summable f) (hg : Summable g)
- (hfg : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
+ (hfg : Summable fun x : ℕ × ℕ ↦ f x.1 * g x.2) :
((∑' n, f n) * ∑' n, g n) = ∑' n, ∑ k in range (n + 1), f k * g (n - k) := by
- simp_rw [← Nat.sum_antidiagonal_eq_sum_range_succ fun k l => f k * g l]
+ simp_rw [← Nat.sum_antidiagonal_eq_sum_range_succ fun k l ↦ f k * g l]
exact tsum_mul_tsum_eq_tsum_sum_antidiagonal hf hg hfg
#align tsum_mul_tsum_eq_tsum_sum_range tsum_mul_tsum_eq_tsum_sum_range
λ x,
in doc comments (#10727)
Use Lean 4 syntax fun x ↦
instead, matching the style guide.
This is close to exhaustive for doc comments; mathlib has about 460 remaining uses of λ (not all in Lean 3 syntax).
@@ -134,7 +134,7 @@ end DivisionSemiring
### Multipliying two infinite sums
In this section, we prove various results about `(∑' x : ι, f x) * (∑' y : κ, g y)`. Note that we
-always assume that the family `λ x : ι × κ, f x.1 * g x.2` is summable, since there is no way to
+always assume that the family `fun x : ι × κ ↦ f x.1 * g x.2` is summable, since there is no way to
deduce this from the summabilities of `f` and `g` in general, but if you are working in a normed
space, you may want to use the analogous lemmas in `Analysis/NormedSpace/Basic`
(e.g `tsum_mul_tsum_of_summable_norm`).
Finset.Nat.antidiagonal
(#7486)
We define a type class Finset.HasAntidiagonal A
which contains a function
antidiagonal : A → Finset (A × A)
such that antidiagonal n
is the Finset of all pairs adding to n
, as witnessed by mem_antidiagonal
.
When A
is a canonically ordered add monoid with locally finite order
this typeclass can be instantiated with Finset.antidiagonalOfLocallyFinite
.
This applies in particular when A
is ℕ
, more generally or σ →₀ ℕ
,
or even ι →₀ A
under the additional assumption OrderedSub A
that make it a canonically ordered add monoid.
(In fact, we would just need an AddMonoid
with a compatible order,
finite Iic
, such that if a + b = n
, then a, b ≤ n
,
and any finiteness condition would be OK.)
For computational reasons it is better to manually provide instances for ℕ
and σ →₀ ℕ
, to avoid quadratic runtime performance.
These instances are provided as Finset.Nat.instHasAntidiagonal
and Finsupp.instHasAntidiagonal
.
This is why Finset.antidiagonalOfLocallyFinite
is an abbrev
and not an instance
.
This definition does not exactly match with that of Multiset.antidiagonal
defined in Mathlib.Data.Multiset.Antidiagonal
, because of the multiplicities.
Indeed, by counting multiplicities, Multiset α
is equivalent to α →₀ ℕ
,
but Finset.antidiagonal
and Multiset.antidiagonal
will return different objects.
For example, for s : Multiset ℕ := {0,0,0}
, Multiset.antidiagonal s
has 8 elements
but Finset.antidiagonal s
has only 4.
def s : Multiset ℕ := {0, 0, 0}
#eval (Finset.antidiagonal s).card -- 4
#eval Multiset.card (Multiset.antidiagonal s) -- 8
HasMulAntidiagonal
(for monoids).
For PNat
, we will recover the set of divisors of a strictly positive integer.This closes #7917
Co-authored by: María Inés de Frutos-Fernández <mariaines.dff@gmail.com> and Eric Wieser <efw27@cam.ac.uk>
Co-authored-by: Antoine Chambert-Loir <antoine.chambert-loir@math.univ-paris-diderot.fr> Co-authored-by: Mario Carneiro <di.gama@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -184,47 +184,57 @@ We prove two versions of the Cauchy product formula. The first one is
involving `Nat` subtraction.
In order to avoid `Nat` subtraction, we also provide `tsum_mul_tsum_eq_tsum_sum_antidiagonal`,
where the `n`-th term is a sum over all pairs `(k, l)` such that `k+l=n`, which corresponds to the
-`Finset` `Finset.Nat.antidiagonal n`
+`Finset` `Finset.antidiagonal n`.
+This in fact allows us to generalize to any type satisfying `[Finset.HasAntidiagonal A]`
-/
section CauchyProduct
-variable [TopologicalSpace α] [NonUnitalNonAssocSemiring α] {f g : ℕ → α}
+section HasAntidiagonal
+variable {A : Type*} [AddCommMonoid A] [HasAntidiagonal A]
+variable [TopologicalSpace α] [NonUnitalNonAssocSemiring α] {f g : A → α}
/- The family `(k, l) : ℕ × ℕ ↦ f k * g l` is summable if and only if the family
-`(n, k, l) : Σ (n : ℕ), Nat.antidiagonal n ↦ f k * g l` is summable. -/
+`(n, k, l) : Σ (n : ℕ), antidiagonal n ↦ f k * g l` is summable. -/
theorem summable_mul_prod_iff_summable_mul_sigma_antidiagonal :
- (Summable fun x : ℕ × ℕ => f x.1 * g x.2) ↔
- Summable fun x : Σn : ℕ, Nat.antidiagonal n => f (x.2 : ℕ × ℕ).1 * g (x.2 : ℕ × ℕ).2 :=
- Nat.sigmaAntidiagonalEquivProd.summable_iff.symm
+ (Summable fun x : A × A => f x.1 * g x.2) ↔
+ Summable fun x : Σn : A, antidiagonal n => f (x.2 : A × A).1 * g (x.2 : A × A).2 :=
+ Finset.sigmaAntidiagonalEquivProd.summable_iff.symm
#align summable_mul_prod_iff_summable_mul_sigma_antidiagonal summable_mul_prod_iff_summable_mul_sigma_antidiagonal
variable [T3Space α] [TopologicalSemiring α]
theorem summable_sum_mul_antidiagonal_of_summable_mul
- (h : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
- Summable fun n => ∑ kl in Nat.antidiagonal n, f kl.1 * g kl.2 := by
+ (h : Summable fun x : A × A => f x.1 * g x.2) :
+ Summable fun n => ∑ kl in antidiagonal n, f kl.1 * g kl.2 := by
rw [summable_mul_prod_iff_summable_mul_sigma_antidiagonal] at h
conv => congr; ext; rw [← Finset.sum_finset_coe, ← tsum_fintype]
exact h.sigma' fun n => (hasSum_fintype _).summable
#align summable_sum_mul_antidiagonal_of_summable_mul summable_sum_mul_antidiagonal_of_summable_mul
/-- The **Cauchy product formula** for the product of two infinites sums indexed by `ℕ`, expressed
-by summing on `Finset.Nat.antidiagonal`.
+by summing on `Finset.antidiagonal`.
See also `tsum_mul_tsum_eq_tsum_sum_antidiagonal_of_summable_norm` if `f` and `g` are absolutely
summable. -/
theorem tsum_mul_tsum_eq_tsum_sum_antidiagonal (hf : Summable f) (hg : Summable g)
- (hfg : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
- ((∑' n, f n) * ∑' n, g n) = ∑' n, ∑ kl in Nat.antidiagonal n, f kl.1 * g kl.2 := by
+ (hfg : Summable fun x : A × A => f x.1 * g x.2) :
+ ((∑' n, f n) * ∑' n, g n) = ∑' n, ∑ kl in antidiagonal n, f kl.1 * g kl.2 := by
conv_rhs => congr; ext; rw [← Finset.sum_finset_coe, ← tsum_fintype]
- rw [tsum_mul_tsum hf hg hfg, ← Nat.sigmaAntidiagonalEquivProd.tsum_eq (_ : ℕ × ℕ → α)]
+ rw [tsum_mul_tsum hf hg hfg, ← sigmaAntidiagonalEquivProd.tsum_eq (_ : A × A → α)]
exact
tsum_sigma' (fun n => (hasSum_fintype _).summable)
(summable_mul_prod_iff_summable_mul_sigma_antidiagonal.mp hfg)
#align tsum_mul_tsum_eq_tsum_sum_antidiagonal tsum_mul_tsum_eq_tsum_sum_antidiagonal
+end HasAntidiagonal
+
+section Nat
+
+variable [TopologicalSpace α] [NonUnitalNonAssocSemiring α] {f g : ℕ → α}
+variable [T3Space α] [TopologicalSemiring α]
+
theorem summable_sum_mul_range_of_summable_mul (h : Summable fun x : ℕ × ℕ => f x.1 * g x.2) :
Summable fun n => ∑ k in range (n + 1), f k * g (n - k) := by
simp_rw [← Nat.sum_antidiagonal_eq_sum_range_succ fun k l => f k * g l]
@@ -243,4 +253,6 @@ theorem tsum_mul_tsum_eq_tsum_sum_range (hf : Summable f) (hg : Summable g)
exact tsum_mul_tsum_eq_tsum_sum_antidiagonal hf hg hfg
#align tsum_mul_tsum_eq_tsum_sum_range tsum_mul_tsum_eq_tsum_sum_range
+end Nat
+
end CauchyProduct
Function.Commute
(#6456)
This PR protects Function.Commute
, so that it no longer clashes with Commute
in the root namespace, as suggested by @j-loreaux in #6290.
@@ -59,13 +59,13 @@ theorem Summable.tsum_mul_right (a) (hf : Summable f) : ∑' i, f i * a = (∑'
(hf.hasSum.mul_right _).tsum_eq
#align summable.tsum_mul_right Summable.tsum_mul_right
-theorem Commute.tsum_right (a) (h : ∀ i, _root_.Commute a (f i)) : _root_.Commute a (∑' i, f i) :=
+theorem Commute.tsum_right (a) (h : ∀ i, Commute a (f i)) : Commute a (∑' i, f i) :=
if hf : Summable f then
(hf.tsum_mul_left a).symm.trans ((congr_arg _ <| funext h).trans (hf.tsum_mul_right a))
else (tsum_eq_zero_of_not_summable hf).symm ▸ Commute.zero_right _
#align commute.tsum_right Commute.tsum_right
-theorem Commute.tsum_left (a) (h : ∀ i, _root_.Commute (f i) a) : _root_.Commute (∑' i, f i) a :=
+theorem Commute.tsum_left (a) (h : ∀ i, Commute (f i) a) : Commute (∑' i, f i) a :=
(Commute.tsum_right _ fun i => (h i).symm).symm
#align commute.tsum_left Commute.tsum_left
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -24,7 +24,7 @@ open Filter Finset Function
open BigOperators Classical
-variable {ι κ R α : Type _}
+variable {ι κ R α : Type*}
section NonUnitalNonAssocSemiring
@@ -2,16 +2,13 @@
Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
-
-! This file was ported from Lean 3 source module topology.algebra.infinite_sum.ring
-! leanprover-community/mathlib commit 9a59dcb7a2d06bf55da57b9030169219980660cd
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Algebra.BigOperators.NatAntidiagonal
import Mathlib.Topology.Algebra.InfiniteSum.Basic
import Mathlib.Topology.Algebra.Ring.Basic
+#align_import topology.algebra.infinite_sum.ring from "leanprover-community/mathlib"@"9a59dcb7a2d06bf55da57b9030169219980660cd"
+
/-!
# Infinite sum in a ring
∑'
precedence (#5615)
∑
, ∏
and variants).([^a-zA-Zα-ωΑ-Ω'𝓝ℳ₀𝕂ₛ)]) \(([∑∏][^()∑∏]*,[^()∑∏:]*)\) ([⊂⊆=<≤])
replaced by $1 $2 $3
@@ -54,11 +54,11 @@ section tsum
variable [T2Space α]
-theorem Summable.tsum_mul_left (a) (hf : Summable f) : (∑' i, a * f i) = a * ∑' i, f i :=
+theorem Summable.tsum_mul_left (a) (hf : Summable f) : ∑' i, a * f i = a * ∑' i, f i :=
(hf.hasSum.mul_left _).tsum_eq
#align summable.tsum_mul_left Summable.tsum_mul_left
-theorem Summable.tsum_mul_right (a) (hf : Summable f) : (∑' i, f i * a) = (∑' i, f i) * a :=
+theorem Summable.tsum_mul_right (a) (hf : Summable f) : ∑' i, f i * a = (∑' i, f i) * a :=
(hf.hasSum.mul_right _).tsum_eq
#align summable.tsum_mul_right Summable.tsum_mul_right
@@ -113,21 +113,21 @@ theorem summable_div_const_iff (h : a ≠ 0) : (Summable fun i => f i / a) ↔ S
simpa only [div_eq_mul_inv] using summable_mul_right_iff (inv_ne_zero h)
#align summable_div_const_iff summable_div_const_iff
-theorem tsum_mul_left [T2Space α] : (∑' x, a * f x) = a * ∑' x, f x :=
+theorem tsum_mul_left [T2Space α] : ∑' x, a * f x = a * ∑' x, f x :=
if hf : Summable f then hf.tsum_mul_left a
else if ha : a = 0 then by simp [ha]
else by rw [tsum_eq_zero_of_not_summable hf,
tsum_eq_zero_of_not_summable (mt (summable_mul_left_iff ha).mp hf), mul_zero]
#align tsum_mul_left tsum_mul_left
-theorem tsum_mul_right [T2Space α] : (∑' x, f x * a) = (∑' x, f x) * a :=
+theorem tsum_mul_right [T2Space α] : ∑' x, f x * a = (∑' x, f x) * a :=
if hf : Summable f then hf.tsum_mul_right a
else if ha : a = 0 then by simp [ha]
else by rw [tsum_eq_zero_of_not_summable hf,
tsum_eq_zero_of_not_summable (mt (summable_mul_right_iff ha).mp hf), zero_mul]
#align tsum_mul_right tsum_mul_right
-theorem tsum_div_const [T2Space α] : (∑' x, f x / a) = (∑' x, f x) / a := by
+theorem tsum_div_const [T2Space α] : ∑' x, f x / a = (∑' x, f x) / a := by
simpa only [div_eq_mul_inv] using tsum_mul_right
#align tsum_div_const tsum_div_const
@@ -138,7 +138,7 @@ end DivisionSemiring
In this section, we prove various results about `(∑' x : ι, f x) * (∑' y : κ, g y)`. Note that we
always assume that the family `λ x : ι × κ, f x.1 * g x.2` is summable, since there is no way to
-deduce this from the summmabilities of `f` and `g` in general, but if you are working in a normed
+deduce this from the summabilities of `f` and `g` in general, but if you are working in a normed
space, you may want to use the analogous lemmas in `Analysis/NormedSpace/Basic`
(e.g `tsum_mul_tsum_of_summable_norm`).
@@ -170,7 +170,7 @@ theorem HasSum.mul (hf : HasSum f s) (hg : HasSum g t)
#align has_sum.mul HasSum.mul
/-- Product of two infinites sums indexed by arbitrary types.
- See also `tsum_mul_tsum_of_summable_norm` if `f` and `g` are abolutely summable. -/
+ See also `tsum_mul_tsum_of_summable_norm` if `f` and `g` are absolutely summable. -/
theorem tsum_mul_tsum (hf : Summable f) (hg : Summable g)
(hfg : Summable fun x : ι × κ => f x.1 * g x.2) :
((∑' x, f x) * ∑' y, g y) = ∑' z : ι × κ, f z.1 * g z.2 :=
The unported dependencies are