|
| 1 | +/- |
| 2 | +Copyright (c) 2025 Weiyi Wang. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Weiyi Wang |
| 5 | +-/ |
| 6 | +module |
| 7 | + |
| 8 | +public import Mathlib.Combinatorics.Enumerative.Pentagonal.Basic |
| 9 | +public import Mathlib.Topology.Algebra.InfiniteSum.Ring |
| 10 | +public import Mathlib.Topology.Algebra.TopologicallyNilpotent |
| 11 | + |
| 12 | +/-! |
| 13 | +# Pentagonal number theorem |
| 14 | +
|
| 15 | +This is an intermediate file that proves the pentagonal number theorem in a general topological ring |
| 16 | +modulo summability and multipliability. The complete proof for formal power series is in |
| 17 | +`Mathlib/RingTheory/PowerSeries/Pentagonal.lean`. TODO: also prove for real/complex numbers. |
| 18 | +
|
| 19 | +## Declarations |
| 20 | +
|
| 21 | +* `Pentagonal.tprod_one_sub_pow`: pentagonal number theorem with a few summability and |
| 22 | + multipliability assumptions. |
| 23 | +
|
| 24 | +## References |
| 25 | +
|
| 26 | +https://math.stackexchange.com/questions/55738/how-to-prove-eulers-pentagonal-theorem-some-hints-will-help |
| 27 | +
|
| 28 | +-/ |
| 29 | + |
| 30 | +namespace Pentagonal |
| 31 | +open Filter Topology |
| 32 | +variable {R : Type*} [CommRing R] |
| 33 | + |
| 34 | +/-- |
| 35 | +We define an auxiliary sequence |
| 36 | +
|
| 37 | +$$ a_{k, n} = x^{(k+1)n} \prod_{i=0}^{n} (1 - x^{k + i + 1}) $$ |
| 38 | +
|
| 39 | +We will also use its sum |
| 40 | +
|
| 41 | +$$ A_k = \sum_{n=0}^{\infty} a_{k, n} $$ -/ |
| 42 | +def powMulProdOneSubPow (k n : ℕ) (x : R) : R := |
| 43 | + x ^ ((k + 1) * n) * ∏ i ∈ Finset.range (n + 1), (1 - x ^ (k + i + 1)) |
| 44 | + |
| 45 | +/-- And a second auxiliary sequence |
| 46 | +
|
| 47 | +$$ b_{k, n} = x^{(k+1)n} (x^{2k + n + 3} - 1) \prod_{i=0}^{n-1} (1 - x^{k + i + 2}) $$ -/ |
| 48 | +def aux (k n : ℕ) (x : R) : R := |
| 49 | + x ^ ((k + 1) * n) * (x ^ (2 * k + n + 3) - 1) * ∏ i ∈ Finset.range n, (1 - x ^ (k + i + 2)) |
| 50 | + |
| 51 | +/-- `powMulProdOneSubPow` and `aux` have relation |
| 52 | +
|
| 53 | +$$ a_{k,n} + x^{3k + 5}a_{k + 1, n} = b_{k, n+1} - b_{k, n} $$ -/ |
| 54 | +theorem aux_sub_aux (k n : ℕ) (x : R) : |
| 55 | + powMulProdOneSubPow k n x + x ^ (3 * k + 5) * powMulProdOneSubPow (k + 1) n x = |
| 56 | + aux k (n + 1) x - aux k n x := by |
| 57 | + simp_rw [aux, Finset.prod_range_succ, powMulProdOneSubPow] |
| 58 | + rw [Finset.prod_range_succ', Finset.prod_range_succ] |
| 59 | + ring_nf |
| 60 | + |
| 61 | +variable [TopologicalSpace R] [IsTopologicalRing R] [T2Space R] |
| 62 | + |
| 63 | +/-- By summing with telescoping, we get a recurrence formula for $A$ |
| 64 | +
|
| 65 | +$$ A_k = 1 - x^{2k + 3} - x^{3k + 5}A_{k + 1} $$ |
| 66 | +-/ |
| 67 | +theorem tsum_powMulProdOneSubPow (k : ℕ) {x : R} (hx : IsTopologicallyNilpotent x) |
| 68 | + (hsum : ∀ k, Summable (powMulProdOneSubPow k · x)) |
| 69 | + (h : ∀ k, Multipliable (fun n ↦ 1 - x ^ (n + k + 1))) : |
| 70 | + ∑' n, powMulProdOneSubPow k n x = |
| 71 | + 1 - x ^ (2 * k + 3) - x ^ (3 * k + 5) * ∑' n, powMulProdOneSubPow (k + 1) n x := by |
| 72 | + rw [eq_sub_iff_add_eq, show 1 - x ^ (2 * k + 3) = 0 - aux k 0 x by simp [aux]] |
| 73 | + rw [← (hsum _).tsum_mul_left, ← (hsum _).tsum_add ((hsum _).mul_left _)] |
| 74 | + apply HasSum.tsum_eq |
| 75 | + rw [((hsum _).add ((hsum _).mul_left _)).hasSum_iff_tendsto_nat] |
| 76 | + simp_rw [aux_sub_aux, Finset.sum_range_sub (aux k · x)] |
| 77 | + apply Tendsto.sub_const |
| 78 | + rw [show 𝓝 0 = 𝓝 (0 * (0 - 1) * ∏' i, (1 - x ^ (k + i + 2))) by simp] |
| 79 | + refine (Tendsto.mul ?_ ?_).mul ?_ |
| 80 | + · exact hx.comp (strictMono_mul_left_of_pos (by simp)).tendsto_atTop |
| 81 | + · exact (hx.comp (add_right_strictMono.add_monotone monotone_const).tendsto_atTop).sub_const _ |
| 82 | + · apply Multipliable.tendsto_prod_tprod_nat |
| 83 | + convert h (k + 1) using 4 |
| 84 | + ring |
| 85 | + |
| 86 | +/-- The Euler function is related to $A_0$ by |
| 87 | +
|
| 88 | +$$ \prod_{n = 0}^{\infty} (1 - x^{n + 1}) = 1 - x - x^2 A_0 $$ -/ |
| 89 | +theorem tprod_one_sub_pow_eq_powMulProdOneSubPow_zero {x : R} |
| 90 | + (hsum : ∀ k, Summable (powMulProdOneSubPow k · x)) |
| 91 | + (h : ∀ k, Multipliable fun n ↦ 1 - x ^ (n + k + 1)) : |
| 92 | + ∏' n, (1 - x ^ (n + 1)) = 1 - x - x ^ 2 * ∑' n, powMulProdOneSubPow 0 n x := by |
| 93 | + have hsum := hsum 0 |
| 94 | + simp_rw [powMulProdOneSubPow, zero_add, one_mul] at hsum |
| 95 | + have hsum' : Summable fun i ↦ x ^ (i + 1) * ∏ n ∈ Finset.range i, (1 - x ^ (n + 1)) := by |
| 96 | + apply Summable.comp_nat_add (k := 1) |
| 97 | + conv in fun k ↦ _ => |
| 98 | + ext k |
| 99 | + rw [pow_add, pow_add, mul_assoc (x ^ k), mul_comm (x ^ k), mul_assoc (x ^ 1 * x ^ 1)] |
| 100 | + exact hsum.mul_left _ |
| 101 | + rw [tprod_one_sub_ordered (by simpa [Nat.Iio_eq_range] using hsum') (by simpa using h 0)] |
| 102 | + simp_rw [Nat.Iio_eq_range, sub_sub, sub_right_inj, hsum'.tsum_eq_zero_add] |
| 103 | + conv in fun k ↦ x ^ (k + 1 + 1) * _ => |
| 104 | + ext k |
| 105 | + rw [pow_add, pow_add, mul_assoc (x ^ k), mul_comm (x ^ k), |
| 106 | + ← pow_add x 1 1, one_add_one_eq_two, mul_assoc (x ^ 2)] |
| 107 | + simp [hsum.tsum_mul_left, powMulProdOneSubPow] |
| 108 | + |
| 109 | +/-- Applying the recurrence formula repeatedly, we get |
| 110 | +
|
| 111 | +$$ \prod_{n = 0}^{\infty} (1 - x^{n + 1}) = |
| 112 | +\left(\sum_{k=0}^{j} (-1)^k \left(x^{k(3k+1)/2} - x^{(k+1)(3k+2)/2}\right) \right) + |
| 113 | +(-1)^{j+1}x^{(j+1)(3j+4)/2}A_j $$ -/ |
| 114 | +theorem tprod_one_sub_pow_eq_powMulProdOneSubPow (j : ℕ) {x : R} (hx : IsTopologicallyNilpotent x) |
| 115 | + (hsum : ∀ k, Summable (powMulProdOneSubPow k · x)) |
| 116 | + (h : ∀ k, Multipliable (fun n ↦ 1 - x ^ (n + k + 1))) : |
| 117 | + ∏' n, (1 - x ^ (n + 1)) = ∑ k ∈ Finset.range (j + 1), |
| 118 | + (-1) ^ k * (x ^ (k * (3 * k + 1) / 2) - x ^ ((k + 1) * (3 * k + 2) / 2)) |
| 119 | + + (-1) ^ (j + 1) * x ^ ((j + 1) * (3 * j + 4) / 2) * ∑' n, powMulProdOneSubPow j n x := by |
| 120 | + induction j with |
| 121 | + | zero => |
| 122 | + simp [tprod_one_sub_pow_eq_powMulProdOneSubPow_zero hsum h, powMulProdOneSubPow, |
| 123 | + ← sub_eq_add_neg] |
| 124 | + | succ n ih => |
| 125 | + rw [ih, tsum_powMulProdOneSubPow _ hx hsum h, Finset.sum_range_succ _ (n + 1)] |
| 126 | + have h (n) : (n + 1 + 1) * (3 * (n + 1) + 2) / 2 = |
| 127 | + (n + 1) * (3 * n + 4) / 2 + (2 * n + 3) := by |
| 128 | + rw [← Nat.add_mul_div_left _ _ (by simp)] |
| 129 | + ring_nf |
| 130 | + simp_rw [h] |
| 131 | + have h (n) : (n + 1 + 1) * (3 * (n + 1) + 4) / 2 = |
| 132 | + (n + 1) * (3 * n + 4) / 2 + (3 * n + 5) := by |
| 133 | + rw [← Nat.add_mul_div_left _ _ (by simp)] |
| 134 | + ring_nf |
| 135 | + simp_rw [h] |
| 136 | + ring_nf |
| 137 | + |
| 138 | +/-- **Pentagonal number theorem**, assuming appropriate multipliability and summability. |
| 139 | +
|
| 140 | +$$ \prod_{n = 0}^{\infty} (1 - x^{n + 1}) = |
| 141 | +\sum_{k=0}^{\infty} (-1)^k \left(x^{k(3k+1)/2} - x^{(k+1)(3k+2)/2}\right) $$ -/ |
| 142 | +public theorem tprod_one_sub_pow {x : R} (hx : IsTopologicallyNilpotent x) |
| 143 | + (hsum : ∀ k, Summable |
| 144 | + (fun n ↦ x ^ ((k + 1) * n) * ∏ i ∈ Finset.range (n + 1), (1 - x ^ (k + i + 1)))) |
| 145 | + (hlhs : ∀ k, Multipliable (fun n ↦ 1 - x ^ (n + k + 1))) |
| 146 | + (hrhs : Summable fun k : ℕ ↦ |
| 147 | + (-1) ^ k * (x ^ pentagonal (-k) - x ^ pentagonal (k + 1))) |
| 148 | + (htail : Tendsto (fun k ↦ (-1) ^ (k + 1) * x ^ ((k + 1) * (3 * k + 4) / 2) * |
| 149 | + ∑' (n : ℕ), x ^ ((k + 1) * n) * ∏ i ∈ Finset.range (n + 1), (1 - x ^ (k + i + 1))) |
| 150 | + atTop (𝓝 0)) : |
| 151 | + ∏' n, (1 - x ^ (n + 1)) = |
| 152 | + ∑' (k : ℕ), (-1) ^ k * (x ^ pentagonal (-k) - x ^ pentagonal (k + 1)) := by |
| 153 | + have h := fun n ↦ tprod_one_sub_pow_eq_powMulProdOneSubPow n hx hsum hlhs |
| 154 | + simp_rw [← sub_eq_iff_eq_add] at h |
| 155 | + refine (HasSum.tsum_eq ?_).symm |
| 156 | + rw [hrhs.hasSum_iff_tendsto_nat, (map_add_atTop_eq_nat 1).symm] |
| 157 | + apply tendsto_map' |
| 158 | + have h1 (k : ℕ) : pentagonal (k + 1) = ((k + 1) * (3 * k + 2) / 2) := by grind [pentagonal_def] |
| 159 | + have h2 (k : ℕ) : pentagonal (-k) = (k * (3 * k + 1) / 2) := by grind [pentagonal_neg] |
| 160 | + simp_rw [h1, h2, Function.comp_def, ← h] |
| 161 | + rw [← tendsto_sub_nhds_zero_iff] |
| 162 | + simpa [powMulProdOneSubPow] using htail.neg |
| 163 | + |
| 164 | +end Pentagonal |
0 commit comments