mathematics_in_lean

My solutions for this book

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
  101. 101
  102. 102
  103. 103
  104. 104
  105. 105
  106. 106
  107. 107
  108. 108
  109. 109
  110. 110
  111. 111
  112. 112
  113. 113
  114. 114
  115. 115
  116. 116
  117. 117
  118. 118
  119. 119
  120. 120
  121. 121
  122. 122
  123. 123
  124. 124
  125. 125
  126. 126
import Mathlib.Data.Real.Basic

def ConvergesTo (s :   ) (a : ) :=
   ε > 0,  N,  n  N, abs (s n - a) < ε

theorem convergesTo_const (a : ) : ConvergesTo (fun x :  => a) a := by
  intro ε εpos
  use 0
  intro n nge; dsimp
  rw [sub_self, abs_zero]
  apply εpos

theorem convergesTo_add {s t :   } {a b : } (cs : ConvergesTo s a) (ct : ConvergesTo t b) :
    ConvergesTo (fun n => s n + t n) (a + b) := by
  intro ε εpos
  dsimp
  have ε2pos : 0 < ε / 2 := by linarith
  cases' cs (ε / 2) ε2pos with Ns hs
  cases' ct (ε / 2) ε2pos with Nt ht
  use max Ns Nt
  intro n hn
  have ngeNs : n  Ns := le_of_max_le_left hn
  have ngeNt : n  Nt := le_of_max_le_right hn
  calc
    |s n + t n - (a + b)| = |s n - a + (t n - b)| := by
      congr
      ring
    _  |s n - a| + |t n - b| := (abs_add _ _)
    _ < ε / 2 + ε / 2 := (add_lt_add (hs n ngeNs) (ht n ngeNt))
    _ = ε := by norm_num


theorem convergesTo_mul_const {s :   } {a : } (c : ) (cs : ConvergesTo s a) :
    ConvergesTo (fun n => c * s n) (c * a) := by
  by_cases h : c = 0
  · convert convergesTo_const 0
    · rw [h, MulZeroClass.zero_mul]
    rw [h, MulZeroClass.zero_mul]
  have acpos : 0 < abs c := abs_pos.mpr h
  intro ε εpos
  dsimp
  have εcpos : 0 < ε / abs c := by apply div_pos εpos acpos
  cases' cs (ε / abs c) εcpos with Ns hs
  use Ns
  intro n ngt
  calc
    |c * s n - c * a| = |c| * |s n - a| := by rw [ abs_mul, mul_sub]
    _ < |c| * (ε / |c|) := (mul_lt_mul_of_pos_left (hs n ngt) acpos)
    _ = ε := mul_div_cancel' _ (ne_of_lt acpos).symm


theorem exists_abs_le_of_converges_to {s :   } {a : } (cs : ConvergesTo s a) :
     N b,  n, N  n  abs (s n) < b := by
  cases' cs 1 zero_lt_one with N h
  use N, abs a + 1
  intro n ngt
  calc
    |s n| = |s n - a + a| := by
      congr
      abel
    _  |s n - a| + |a| := (abs_add _ _)
    _ < |a| + 1 := by linarith [h n ngt]


theorem aux {s t :   } {a : } (cs : ConvergesTo s a) (ct : ConvergesTo t 0) :
    ConvergesTo (fun n => s n * t n) 0 := by
  intro ε εpos
  dsimp
  rcases exists_abs_le_of_convergesTo cs with N₀, B, h₀
  have Bpos : 0 < B := lt_of_le_of_lt (abs_nonneg _) (h₀ N₀ (le_refl _))
  have pos₀ : ε / B > 0 := div_pos εpos Bpos
  cases' ct _ pos₀ with N₁ h₁
  use max N₀ N₁
  intro n ngt
  have ngeN₀ : n  N₀ := le_of_max_le_left ngt
  have ngeN₁ : n  N₁ := le_of_max_le_right ngt
  calc
    |s n * t n - 0| = |s n| * |t n - 0| := by rw [sub_zero, abs_mul, sub_zero]
    _ < B * (ε / B) := (mul_lt_mul'' (h₀ n ngeN₀) (h₁ n ngeN₁) (abs_nonneg _) (abs_nonneg _))
    _ = ε := mul_div_cancel' _ (ne_of_lt Bpos).symm

theorem convergesTo_mul {s t :   } {a b : } (cs : ConvergesTo s a) (ct : ConvergesTo t b) :
    ConvergesTo (fun n => s n * t n) (a * b) := by
  have h₁ : ConvergesTo (fun n => s n * (t n + -b)) 0 := by
    apply aux cs
    convert convergesTo_add ct (convergesTo_const (-b))
    ring
  have := convergesTo_add h₁ (convergesTo_mul_const b cs)
  convert convergesTo_add h₁ (convergesTo_mul_const b cs) using 1
  · ext; ring
  ring

theorem convergesTo_unique {s :   } {a b : } (sa : ConvergesTo s a) (sb : ConvergesTo s b) :
    a = b := by
  by_contra abne
  have : abs (a - b) > 0 := by
    apply lt_of_le_of_ne
    · apply abs_nonneg
    intro h''
    apply abne
    apply eq_of_abs_sub_eq_zero h''.symm
  let ε := abs (a - b) / 2
  have εpos : ε > 0 := by
    change abs (a - b) / 2 > 0
    linarith
  cases' sa ε εpos with Na hNa
  cases' sb ε εpos with Nb hNb
  let N := max Na Nb
  have absa : abs (s N - a) < ε := by
    apply hNa
    apply le_max_left
  have absb : abs (s N - b) < ε := by
    apply hNb
    apply le_max_right
  have : abs (a - b) < abs (a - b)
  calc
    abs (a - b) = abs (-(s N - a) + (s N - b)) := by
      congr
      ring
    _  abs (-(s N - a)) + abs (s N - b) := (abs_add _ _)
    _ = abs (s N - a) + abs (s N - b) := by rw [abs_neg]
    _ < ε + ε := (add_lt_add absa absb)
    _ = abs (a - b) := by norm_num

  exact lt_irrefl _ this