src/HOL/ex/Triangular_Numbers.thy
author wenzelm
Mon, 25 Mar 2019 17:21:26 +0100
changeset 69981 3dced198b9ec
parent 69716 749aaeb40788
permissions -rw-r--r--
more strict AFP properties;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69716
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     1
(*
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     2
  Title:     HOL/ex/Triangular_Numbers.thy
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     3
  Author:    Manuel Eberl, TU München
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     4
*)
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     5
section \<open>Triangular Numbers\<close>
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     6
theory Triangular_Numbers
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     7
  imports Complex_Main
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     8
begin
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     9
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    10
definition triangle_num :: "nat \<Rightarrow> nat" where
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    11
  "triangle_num n = (n * (n + 1)) div 2"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    12
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    13
lemma real_triangle_num:
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    14
  "real (triangle_num n) = real n * (real n + 1) / 2"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    15
  by (simp add: triangle_num_def field_char_0_class.of_nat_div algebra_simps)
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    16
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    17
lemma triangle_num_altdef: "triangle_num n = (\<Sum>k\<le>n. k)"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    18
  by (induction n) (auto simp: triangle_num_def)
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    19
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    20
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    21
lemma triangle_num_ge: "triangle_num n \<ge> n"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    22
  unfolding triangle_num_altdef by (rule member_le_sum) auto
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    23
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    24
lemma triangle_num_Suc: "triangle_num (Suc n) = triangle_num n + Suc n"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    25
  by (simp add: triangle_num_altdef)
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    26
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    27
lemma triangle_num_0 [simp]: "triangle_num 0 = 0"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    28
  and triangle_num_1 [simp]: "triangle_num 1 = 1"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    29
  by (simp_all add: triangle_num_def)
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    30
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    31
lemma triangle_num_numeral [simp]:
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    32
  "triangle_num (numeral n) = fst (divmod (n * Num.inc n) (Num.Bit0 Num.One))"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    33
  unfolding fst_divmod numeral_mult numeral_inc triangle_num_def ..
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    34
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    35
lemma triangle_num_eq_0_iff [simp]: "triangle_num n = 0 \<longleftrightarrow> n = 0"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    36
  using triangle_num_ge[of n] by auto
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    37
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    38
lemma triangle_num_gt_0_iff [simp]: "triangle_num n > 0 \<longleftrightarrow> n > 0"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    39
  using triangle_num_eq_0_iff[of n] by linarith
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    40
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    41
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    42
lemma strict_mono_triangle_num: "strict_mono triangle_num"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    43
  unfolding strict_mono_Suc_iff by (auto simp: triangle_num_altdef)
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    44
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    45
lemma triangle_num_le: "m \<le> n \<Longrightarrow> triangle_num m \<le> triangle_num n"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    46
  using strict_mono_leD[OF strict_mono_triangle_num] .
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    47
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    48
lemma triangle_num_less: "m < n \<Longrightarrow> triangle_num m < triangle_num n"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    49
  using strict_monoD[OF strict_mono_triangle_num] .
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    50
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    51
lemma triangle_num_less_iff: "triangle_num m < triangle_num n \<longleftrightarrow> m < n"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    52
  using strict_mono_less[OF strict_mono_triangle_num] .
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    53
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    54
lemma triangle_num_le_iff: "triangle_num m \<le> triangle_num n \<longleftrightarrow> m \<le> n"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    55
  using strict_mono_less_eq[OF strict_mono_triangle_num] .
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    56
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    57
lemma triangle_num_eq_iff: "triangle_num m = triangle_num n \<longleftrightarrow> m = n"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    58
  using strict_mono_eq[OF strict_mono_triangle_num] .
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    59
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    60
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    61
theorem inverse_triangle_num_sums: "(\<lambda>n. 1 / triangle_num (Suc n)) sums 2"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    62
proof -
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    63
  have "(\<lambda>n. inverse (real (Suc n)) - inverse (real (Suc (Suc n)))) sums
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    64
          (inverse (real (Suc 0)) - 0)"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    65
    by (intro telescope_sums' LIMSEQ_inverse_real_of_nat)
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    66
  also have "(\<lambda>n. inverse (real (Suc n)) - inverse (real (Suc (Suc n)))) =
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    67
               (\<lambda>n. 1 / real (2 * triangle_num (Suc n)))"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    68
    by (auto simp: field_simps triangle_num_def)
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    69
  also have "inverse (real (Suc 0)) - 0 = 1"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    70
    by simp
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    71
  finally have "(\<lambda>n. 2 * (1 / real (2 * triangle_num (Suc n)))) sums (2 * 1)"
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    72
    by (intro sums_mult)
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    73
  thus ?thesis by simp
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    74
qed
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    75
749aaeb40788 Added triangular numbers
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    76
end