src/HOL/Decision_Procs/Approximation.thy
changeset 31148 7ba7c1f8bc22
parent 31099 03314c427b34
child 31467 f7d2aa438bee
equal deleted inserted replaced
31144:bdc1504ad456 31148:7ba7c1f8bc22
   458 lemma arctan_0_1_bounds: assumes "0 \<le> real x" "real x \<le> 1"
   458 lemma arctan_0_1_bounds: assumes "0 \<le> real x" "real x \<le> 1"
   459   shows "arctan (real x) \<in> {real (x * lb_arctan_horner prec (get_even n) 1 (x * x)) .. real (x * ub_arctan_horner prec (get_odd n) 1 (x * x))}"
   459   shows "arctan (real x) \<in> {real (x * lb_arctan_horner prec (get_even n) 1 (x * x)) .. real (x * ub_arctan_horner prec (get_odd n) 1 (x * x))}"
   460 proof (cases "even n")
   460 proof (cases "even n")
   461   case True
   461   case True
   462   obtain n' where "Suc n' = get_odd n" and "odd (Suc n')" using get_odd_ex by auto
   462   obtain n' where "Suc n' = get_odd n" and "odd (Suc n')" using get_odd_ex by auto
   463   hence "even n'" unfolding even_nat_Suc by auto
   463   hence "even n'" unfolding even_Suc by auto
   464   have "arctan (real x) \<le> real (x * ub_arctan_horner prec (get_odd n) 1 (x * x))"
   464   have "arctan (real x) \<le> real (x * ub_arctan_horner prec (get_odd n) 1 (x * x))"
   465     unfolding `Suc n' = get_odd n`[symmetric] using arctan_0_1_bounds'[OF `0 \<le> real x` `real x \<le> 1` `even n'`] by auto
   465     unfolding `Suc n' = get_odd n`[symmetric] using arctan_0_1_bounds'[OF `0 \<le> real x` `real x \<le> 1` `even n'`] by auto
   466   moreover
   466   moreover
   467   have "real (x * lb_arctan_horner prec (get_even n) 1 (x * x)) \<le> arctan (real x)"
   467   have "real (x * lb_arctan_horner prec (get_even n) 1 (x * x)) \<le> arctan (real x)"
   468     unfolding get_even_def if_P[OF True] using arctan_0_1_bounds'[OF `0 \<le> real x` `real x \<le> 1` `even n`] by auto
   468     unfolding get_even_def if_P[OF True] using arctan_0_1_bounds'[OF `0 \<le> real x` `real x \<le> 1` `even n`] by auto
   469   ultimately show ?thesis by auto
   469   ultimately show ?thesis by auto
   470 next
   470 next
   471   case False hence "0 < n" by (rule odd_pos)
   471   case False hence "0 < n" by (rule odd_pos)
   472   from gr0_implies_Suc[OF this] obtain n' where "n = Suc n'" ..
   472   from gr0_implies_Suc[OF this] obtain n' where "n = Suc n'" ..
   473   from False[unfolded this even_nat_Suc]
   473   from False[unfolded this even_Suc]
   474   have "even n'" and "even (Suc (Suc n'))" by auto
   474   have "even n'" and "even (Suc (Suc n'))" by auto
   475   have "get_odd n = Suc n'" unfolding get_odd_def if_P[OF False] using `n = Suc n'` .
   475   have "get_odd n = Suc n'" unfolding get_odd_def if_P[OF False] using `n = Suc n'` .
   476 
   476 
   477   have "arctan (real x) \<le> real (x * ub_arctan_horner prec (get_odd n) 1 (x * x))"
   477   have "arctan (real x) \<le> real (x * ub_arctan_horner prec (get_odd n) 1 (x * x))"
   478     unfolding `get_odd n = Suc n'` using arctan_0_1_bounds'[OF `0 \<le> real x` `real x \<le> 1` `even n'`] by auto
   478     unfolding `get_odd n = Suc n'` using arctan_0_1_bounds'[OF `0 \<le> real x` `real x \<le> 1` `even n'`] by auto