1-- The reciprocals of the triangular numbers sum to 22-- Part of Cumulus, the Grace17 mathematics library.3-- Copyright (c) 2026 Grant Passmore.4-- Released under the Apache License 2.0. See LICENSE in the repository root.5-- Authors: Grant Passmore67module Grace.Cumulus.Real.Analysis.TriangularSeries8import ArchimedeanLimits910-- The partial sums 2n/(n + 1) are twice the successor ratios.11theorem triangularSeries.partial_sums (n : Nat)12shows prefixSums(triangularReciprocals)[n] =13 mulSequence(constantSequence((2:R)), successorRatios)[n]14proof15have sequence := triangularReciprocals.sequence16have ratios := successorRatios.sequence17have constants := constantSequence.sequence at (2:R)18have constantReal := RealSequence.value at constantSequence((2:R)), n with19 constants20have ratioReal := RealSequence.value at successorRatios, n with ratios21have product := mulSequence.value at22 constantSequence((2:R)), successorRatios, n with23 constants, ratios, constantReal, ratioReal24have constant := constantSequence.value at (2:R), n with*25have ratio := successorRatios.value at n26have value := prefixSums.value at triangularReciprocals, n with sequence27have formula := realPartialSum.triangular_reciprocals at n28have countReal := realNat.real at n29have numeratorReal : (2:R) * (realNat(n):R) ∈ ℝ bytypecheck30have denominatorReal : (realNat(n):R) +1∈ ℝ bytypecheck31have inverseReal := realInvValue.real at (realNat(n):R) +132have regroup : (2:R) * (realNat(n):R) / ((realNat(n):R) +1) =33 (2:R) * ((realNat(n):R) / ((realNat(n):R) +1))34have first := realDiv.eq_mul_inv at35 (2:R) * (realNat(n):R), (realNat(n):R) +1with*36have second := realDiv.eq_mul_inv at37 (realNat(n):R), (realNat(n):R) +1with*38rw [first, second]39ring40rw [value, formula, product, constant, ratio, regroup]41rfl4243-- Σ_{k=1}^{∞} 1/T_k = 2, where T_k = k(k + 1)/2.44theorem triangularReciprocals.sums_to45shows SumsTo(triangularReciprocals, (2:R))46proof47have sequence := triangularReciprocals.sequence48have prefixes := prefixSums.sequence with sequence49have constants := constantSequence.converges at (2:R)50have limit := ConvergesTo.mul with constants, successorRatios.converges_one51have one := realMulValue.one_right at (2:R)52rw one at limit53have equal : ∀ n ∈ ℕ, prefixSums(triangularReciprocals)[n] =54 mulSequence(constantSequence((2:R)), successorRatios)[n]55intros n naturalN56have typedN : Nat(n) byexact nat.omega.backward at n with naturalN57exact triangularSeries.partial_sums at n58have converges := ConvergesTo.of_equal_terms with prefixes, limit, equal59exact SumsTo.of_converges with sequence, converges60