--- title: Pruebas de a+aq+aq²+···+aqⁿ = a(1-qⁿ⁺¹)/(1-q) date: 2024-09-09 06:00:00 UTC+02:00 category: Inducción has_math: true --- [mathjax] Demostrar que si \\(q ≠ 1\\), entonces la suma de los términos de la progresión geométrica \\[ a + aq + aq^2 + ··· + aq^n \\] es \\[ \\dfrac{a(1 - q^{n+1})}{1 - q} \\] Para ello, completar la siguiente teoría de Lean4:
import Mathlib.Data.Nat.Defs
import Mathlib.Tactic

open Nat

variable (n : ℕ)
variable (a q : ℝ)

def sumaPG : ℝ → ℝ → ℕ → ℝ
  | a, _, 0     => a
  | a, q, n + 1 => sumaPG a q n + (a * q^(n + 1))

example
  (h : q ≠ 1)
  : sumaPG a q n = a * (1 - q^(n + 1)) / (1 - q) :=
by sorry

1. Demostración en lenguaje natural

Sea \\[ s(a,q,n) = a + aq + aq^2 + ··· + aq^n \\] Tenemos que demostrar que \\[ s(a,q,n) = a(1 - q^{n+1})/(1 - q) \\] o, equivalentemente que \\[ (1 - q)s(a,q,n) = a(1 - q^{n+1}) \\] Lo haremos por inducción sobre \\(n\\). **Caso base:** Sea \\(n = 0\\). Entonces, \\begin{align} (1 - q)s(a,q,n) &= (1 - q)s(a, q, 0) \\\\ &= (1 - q)a \\\\ &= a(1 - q^{0 + 1}) \\\\ &= a(1 - q^{n + 1}) \\end{align} **Paso de inducción:** Sea \\(n = m+1\\) y supongamos la hipótesis de inducción (HI) \\[ (1 - q)s(a,q,m) = a(1 - q^{n + 1}) \\] Entonces, \\begin{align} (1 - q)s(a,q,n) \\\\ &= (1 - q)s(a,q,m+1) \\\\ &= (1 - q)(s(a,q,m) + aq^(m + 1)) \\\\ &= (1 - q)s(a,q,m) + (1 - q)aq^(m + 1) \\\\ &= a(1 - q^(m + 1)) + (1 - q)aq^(m + 1) &&\\text{[por HI]} \\\\ &= a(1 - q^(m + 1 + 1)) \\\\ &= a(1 - q^(n + 1)) \\end{align}

2. Demostraciones con Lean4

import Mathlib.Data.Nat.Defs
import Mathlib.Tactic

open Nat

variable (n : ℕ)
variable (a q : ℝ)

set_option pp.fieldNotation false

@[simp]
def sumaPG : ℝ → ℝ → ℕ → ℝ
  | a, _, 0     => a
  | a, q, n + 1 => sumaPG a q n + (a * q^(n + 1))

-- 1ª demostración
-- ===============

example
  (h : q ≠ 1)
  : sumaPG a q n = a * (1 - q^(n + 1)) / (1 - q) :=
by
  have h1 : 1 - q ≠ 0 := by exact sub_ne_zero_of_ne (id (Ne.symm h))
  suffices h : (1 - q) * sumaPG a q n = a * (1 - q ^ (n + 1))
    from by exact CancelDenoms.cancel_factors_eq_div h h1
  induction n with
  | zero =>
    -- ⊢ (1 - q) * sumaPG a q 0 = a * (1 - q ^ (0 + 1))
    calc (1 - q) * sumaPG a q 0
         = (1 - q) * a           := by simp only [sumaPG]
       _ = a * (1 - q)           := by simp only [mul_comm]
       _ = a * (1 - q ^ 1)       := by simp
       _ = a * (1 - q ^ (0 + 1)) := by simp
  | succ m HI =>
    -- m : ℕ
    -- HI : (1 - q) * sumaPG a q m = a * (1 - q ^ (m + 1))
    -- ⊢ (1 - q) * sumaPG a q (m + 1) = a * (1 - q ^ (m + 1 + 1))
    calc (1 - q) * sumaPG a q (m + 1)
         = (1 - q) * (sumaPG a q m + (a * q^(m + 1)))
           := by simp only [sumaPG]
       _ = (1 - q) * sumaPG a q m + (1 - q) * (a * q ^ (m + 1))
           := by rw [left_distrib]
       _ = a * (1 - q ^ (m + 1)) + (1 - q) * (a * q ^ (m + 1))
           := congrArg  (. + (1 - q) * (a * q ^ (m + 1))) HI
       _ = a * (1 - q ^ (m + 1 + 1))
           := by ring_nf

-- 2ª demostración
-- ===============

example
  (h : q ≠ 1)
  : sumaPG a q n = a * (1 - q^(n + 1)) / (1 - q) :=
by
  have h1 : 1 - q ≠ 0 := by exact sub_ne_zero_of_ne (id (Ne.symm h))
  suffices h : (1 - q) * sumaPG a q n = a * (1 - q ^ (n + 1))
    from by exact CancelDenoms.cancel_factors_eq_div h h1
  induction n with
  | zero =>
    -- ⊢ (1 - q) * sumaPG a q 0 = a * (1 - q ^ (0 + 1))
    simp
    -- ⊢ (1 - q) * a = a * (1 - q)
    ring_nf
  | succ m HI =>
    -- m : ℕ
    -- HI : (1 - q) * sumaPG a q m = a * (1 - q ^ (m + 1))
    -- ⊢ (1 - q) * sumaPG a q (m + 1) = a * (1 - q ^ (m + 1 + 1))
    calc (1 - q) * sumaPG a q (m + 1)
         = (1 - q) * (sumaPG a q m + (a * q ^ (m + 1)))
           := rfl
       _ = (1 - q) * sumaPG a q m + (1 - q) * (a * q ^ (m + 1))
           := by ring_nf
       _ = a * (1 - q ^ (m + 1)) + (1 - q) * (a * q ^ (m + 1))
           := congrArg  (. + (1 - q) * (a * q ^ (m + 1))) HI
       _ = a * (1 - q ^ (m + 1 + 1))
           := by ring_nf
Se puede interactuar con las demostraciones anteriores en [Lean 4 Web](https://live.lean-lang.org/#url=https://raw.githubusercontent.com/jaalonso/Calculemus2_es/main/src/Suma_de_progresion_geometrica.lean).

3. Demostraciones con Isabelle/HOL

theory Suma_de_progresion_geometrica
imports Main HOL.Real
begin

fun sumaPG :: "real ⇒ real ⇒ nat ⇒ real" where
  "sumaPG a q 0 = a"
| "sumaPG a q (Suc n) = sumaPG a q n + (a * q^(n + 1))"

(* 1ª demostración *)
lemma
  "(1 - q) * sumaPG a q n = a * (1 - q^(n + 1))"
proof (induct n)
  show "(1 - q) * sumaPG a q 0 = a * (1 - q ^ (0 + 1))"
    by simp
next
  fix n
  assume HI : "(1 - q) * sumaPG a q n = a * (1 - q ^ (n + 1))"
  have "(1 - q) * sumaPG a q (Suc n) =
        (1 - q) * (sumaPG a q n + (a * q^(n + 1)))"
    by simp
  also have "… = (1 - q) * sumaPG a q n + (1 - q) * a * q^(n + 1)"
    by (simp add: algebra_simps)
  also have "… = a * (1 - q ^ (n + 1)) + (1 - q) * a * q^(n + 1)"
    using HI by simp
  also have "… = a * (1 - q ^ (n + 1) + (1 - q) * q^(n + 1))"
    by (simp add: algebra_simps)
  also have "… = a * (1 - q ^ (n + 1) +  q^(n + 1) - q^(n + 2))"
    by (simp add: algebra_simps)
  also have "… = a * (1 - q^(n + 2))"
    by simp
  also have "… = a * (1 - q ^ (Suc n + 1))"
    by simp
  finally show "(1 - q) * sumaPG a q (Suc n) = a * (1 - q ^ (Suc n + 1))"
    by this
qed

(* 2ª demostración *)
lemma
  "(1 - q) * sumaPG a q n = a * (1 - q^(n + 1))"
proof (induct n)
  show "(1 - q) * sumaPG a q 0 = a * (1 - q ^ (0 + 1))"
    by simp
next
  fix n
  assume HI : "(1 - q) * sumaPG a q n = a * (1 - q ^ (n + 1))"
  have "(1 - q) * sumaPG a q (Suc n) =
        (1 - q) * sumaPG a q n + (1 - q) * a * q^(n + 1)"
    by (simp add: algebra_simps)
  also have "… = a * (1 - q ^ (n + 1)) + (1 - q) * a * q^(n + 1)"
    using HI by simp
  also have "… = a * (1 - q ^ (n + 1) +  q^(n + 1) - q^(n + 2))"
    by (simp add: algebra_simps)
  finally show "(1 - q) * sumaPG a q (Suc n) = a * (1 - q ^ (Suc n + 1))"
    by simp
qed

(* 3ª demostración *)
lemma
  "(1 - q) * sumaPG a q n = a * (1 - q^(n + 1))"
  using power_add
  by (induct n) (auto simp: algebra_simps)

end