src/HOL/Analysis/Kronecker_Approximation_Theorem.thy
author nipkow
Tue, 17 Jun 2025 14:11:40 +0200
changeset 82733 8b537e1af2ec
parent 80528 6dec6b1f31f5
permissions -rw-r--r--
reinstated intersection of lists as inter_list_set
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
78890
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     1
chapter \<open>Kronecker's Theorem with Applications\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     2
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     3
theory Kronecker_Approximation_Theorem
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     4
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     5
imports Complex_Transcendental Henstock_Kurzweil_Integration 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     6
        "HOL-Real_Asymp.Real_Asymp"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     7
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     8
begin
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     9
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    10
section \<open>Dirichlet's Approximation Theorem\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    11
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    12
text \<open>Simultaneous version. From Hardy and Wright, An Introduction to the Theory of Numbers, page 170.\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    13
theorem Dirichlet_approx_simult:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    14
  fixes \<theta> :: "nat \<Rightarrow> real" and N n :: nat
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    15
  assumes "N > 0" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    16
  obtains q p where "0<q" "q \<le> int (N^n)" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    17
    and "\<And>i. i<n \<Longrightarrow> \<bar>of_int q * \<theta> i - of_int(p i)\<bar> < 1/N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    18
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    19
  have lessN: "nat \<lfloor>x * real N\<rfloor> < N" if "0 \<le> x" "x < 1" for x
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    20
  proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    21
    have "\<lfloor>x * real N\<rfloor> < N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    22
      using that by (simp add: assms floor_less_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    23
    with assms show ?thesis by linarith
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    24
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    25
  define interv where "interv \<equiv> \<lambda>k. {real k/N..< Suc k/N}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    26
  define fracs where "fracs \<equiv> \<lambda>k. map (\<lambda>i. frac (real k * \<theta> i)) [0..<n]"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    27
  define X where "X \<equiv> fracs ` {..N^n}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    28
  define Y where "Y \<equiv> set (List.n_lists n (map interv [0..<N]))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    29
  have interv_iff: "interv k = interv k' \<longleftrightarrow> k=k'" for k k'
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    30
    using assms by (auto simp: interv_def Ico_eq_Ico divide_strict_right_mono)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    31
  have in_interv: "x \<in> interv (nat \<lfloor>x * real N\<rfloor>)" if "x\<ge>0" for x
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    32
    using that assms by (simp add: interv_def divide_simps) linarith
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    33
  have False 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    34
    if non: "\<forall>a b. b \<le> N^n \<longrightarrow> a < b \<longrightarrow> \<not>(\<forall>i<n. \<bar>frac (real b * \<theta> i) - frac (real a * \<theta> i)\<bar> < 1/N)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    35
  proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    36
    have "inj_on (\<lambda>k. map (\<lambda>i. frac (k * \<theta> i)) [0..<n]) {..N^n}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    37
      using that assms by (intro linorder_inj_onI) fastforce+
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    38
    then have caX: "card X = Suc (N^n)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    39
      by (simp add: X_def fracs_def card_image)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    40
    have caY: "card Y \<le> N^n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    41
      by (metis Y_def card_length diff_zero length_map length_n_lists length_upt)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    42
    define f where "f \<equiv> \<lambda>l. map (\<lambda>x. interv (nat \<lfloor>x * real N\<rfloor>)) l"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    43
    have "f ` X \<subseteq> Y"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    44
      by (auto simp: f_def Y_def X_def fracs_def o_def set_n_lists frac_lt_1 lessN)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    45
    then have "\<not> inj_on f X"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    46
      using Y_def caX caY card_inj_on_le not_less_eq_eq by fastforce
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    47
    then obtain x x' where "x\<noteq>x'" "x \<in> X" "x' \<in> X" and eq: "f x = f x'"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    48
      by (auto simp: inj_on_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    49
    then obtain c c' where c: "c \<noteq> c'" "c \<le> N^n" "c' \<le> N^n" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    50
            and xeq: "x = fracs c" and xeq': "x' = fracs c'"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    51
      unfolding X_def by (metis atMost_iff image_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    52
    have [simp]: "length x' = n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    53
      by (auto simp: xeq' fracs_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    54
    have ge0: "x'!i \<ge> 0" if "i<n" for i
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    55
      using that \<open>x' \<in> X\<close> by (auto simp: X_def fracs_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    56
    have "f x \<in> Y"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    57
      using \<open>f ` X \<subseteq> Y\<close> \<open>x \<in> X\<close> by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    58
    define k where "k \<equiv> map (\<lambda>r. nat \<lfloor>r * real N\<rfloor>) x"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    59
    have "\<bar>frac (real c * \<theta> i) - frac (real c' * \<theta> i)\<bar> < 1/N" if "i < n" for i
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    60
    proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    61
      have k: "x!i \<in> interv(k!i)" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    62
        using \<open>i<n\<close> assms by (auto simp: divide_simps k_def interv_def xeq fracs_def) linarith
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    63
      then have k': "x'!i \<in> interv(k!i)" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    64
        using \<open>i<n\<close> eq assms ge0[OF \<open>i<n\<close>]
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    65
        by (auto simp: k_def f_def divide_simps map_equality_iff in_interv interv_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    66
      with assms k show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    67
        using \<open>i<n\<close> by (auto simp add: xeq xeq' fracs_def interv_def add_divide_distrib)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    68
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    69
    then show False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    70
      by (metis c non nat_neq_iff abs_minus_commute)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    71
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    72
  then obtain a b where "a<b" "b \<le> N^n" and *: "\<And>i. i<n \<Longrightarrow> \<bar>frac (real b * \<theta> i) - frac (real a * \<theta> i)\<bar> < 1/N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    73
    by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    74
  let ?k = "b-a"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    75
  let ?h = "\<lambda>i. \<lfloor>b * \<theta> i\<rfloor> - \<lfloor>a * \<theta> i\<rfloor>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    76
  show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    77
  proof
80175
200107cdd3ac Some new simprules – and patches for proofs
paulson <lp15@cam.ac.uk>
parents: 78890
diff changeset
    78
    show "int (b - a) \<le> int (N ^ n)"
200107cdd3ac Some new simprules – and patches for proofs
paulson <lp15@cam.ac.uk>
parents: 78890
diff changeset
    79
      using \<open>b \<le> N ^ n\<close> by auto
200107cdd3ac Some new simprules – and patches for proofs
paulson <lp15@cam.ac.uk>
parents: 78890
diff changeset
    80
  next
78890
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    81
    fix i
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    82
    assume "i<n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    83
    have "frac (b * \<theta> i) - frac (a * \<theta> i) = ?k * \<theta> i - ?h i"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    84
      using \<open>a < b\<close> by (simp add: frac_def left_diff_distrib' of_nat_diff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    85
    then show "\<bar>of_int ?k * \<theta> i - ?h i\<bar> < 1/N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    86
      by (metis "*" \<open>i < n\<close> of_int_of_nat_eq)
80175
200107cdd3ac Some new simprules – and patches for proofs
paulson <lp15@cam.ac.uk>
parents: 78890
diff changeset
    87
  qed (use \<open>a < b\<close> in auto)
78890
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    88
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    89
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    90
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    91
text \<open>Theorem 7.1\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    92
corollary Dirichlet_approx:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    93
  fixes \<theta>:: real and N:: nat
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    94
  assumes "N > 0" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    95
  obtains h k where "0 < k" "k \<le> int N" "\<bar>of_int k * \<theta> - of_int h\<bar> < 1/N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    96
  by (rule Dirichlet_approx_simult [OF assms, where n=1 and \<theta>="\<lambda>_. \<theta>"]) auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    97
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    98
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    99
text \<open>Theorem 7.2\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   100
corollary Dirichlet_approx_coprime:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   101
  fixes \<theta>:: real and N:: nat
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   102
  assumes "N > 0" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   103
  obtains h k where "coprime h k" "0 < k" "k \<le> int N" "\<bar>of_int k * \<theta> - of_int h\<bar> < 1/N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   104
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   105
  obtain h' k' where k': "0 < k'" "k' \<le> int N" and *: "\<bar>of_int k' * \<theta> - of_int h'\<bar> < 1/N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   106
    by (meson Dirichlet_approx assms)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   107
  let ?d = "gcd h' k'"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   108
  show thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   109
  proof (cases "?d = 1")
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   110
    case True
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   111
    with k' * that show ?thesis by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   112
  next
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   113
    case False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   114
    then have 1: "?d > 1"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   115
      by (smt (verit, ccfv_threshold) \<open>k'>0\<close> gcd_pos_int)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   116
    let ?k = "k' div ?d"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   117
    let ?h = "h' div ?d"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   118
    show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   119
    proof
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   120
      show "coprime (?h::int) ?k"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   121
        by (metis "1" div_gcd_coprime gcd_eq_0_iff not_one_less_zero)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   122
      show k0: "0 < ?k"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   123
        using \<open>k'>0\<close> pos_imp_zdiv_pos_iff by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   124
      show "?k \<le> int N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   125
        using k' "1" int_div_less_self by fastforce
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   126
      have "\<bar>\<theta> - of_int ?h / of_int ?k\<bar> = \<bar>\<theta> - of_int h' / of_int k'\<bar>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   127
        by (simp add: real_of_int_div)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   128
      also have "\<dots> < 1 / of_int (N * k')"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   129
        using k' * by (simp add: field_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   130
      also have "\<dots> < 1 / of_int (N * ?k)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   131
        using assms \<open>k'>0\<close> k0 1
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   132
        by (simp add: frac_less2 int_div_less_self)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   133
      finally show "\<bar>of_int ?k * \<theta> - of_int ?h\<bar> < 1 / real N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   134
        using k0 k' by (simp add: field_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   135
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   136
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   137
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   138
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   139
definition approx_set :: "real \<Rightarrow> (int \<times> int) set"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   140
  where "approx_set \<theta> \<equiv> 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   141
     {(h, k) | h k::int. k > 0 \<and> coprime h k \<and> \<bar>\<theta> - of_int h / of_int k\<bar> < 1/k\<^sup>2}" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   142
  for \<theta>::real
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   143
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   144
text \<open>Theorem 7.3\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   145
lemma approx_set_nonempty: "approx_set \<theta> \<noteq> {}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   146
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   147
  have "\<bar>\<theta> - of_int \<lfloor>\<theta>\<rfloor> / of_int 1\<bar> < 1 / (of_int 1)\<^sup>2"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   148
    by simp linarith
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   149
  then have "(\<lfloor>\<theta>\<rfloor>, 1) \<in> approx_set \<theta>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   150
    by (auto simp: approx_set_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   151
  then show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   152
    by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   153
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   154
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   155
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   156
text \<open>Theorem 7.4(c)\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   157
theorem infinite_approx_set:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   158
  assumes "infinite (approx_set \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   159
  shows  "\<exists>h k. (h,k) \<in> approx_set \<theta> \<and> k > K"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   160
proof (rule ccontr, simp add: not_less)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   161
  assume Kb [rule_format]: "\<forall>h k. (h, k) \<in> approx_set \<theta> \<longrightarrow> k \<le> K"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   162
  define H where "H \<equiv> 1 + \<bar>K * \<theta>\<bar>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   163
  have k0:  "k > 0" if "(h,k) \<in> approx_set \<theta>" for h k
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   164
    using approx_set_def that by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   165
  have Hb: "of_int \<bar>h\<bar> < H" if "(h,k) \<in> approx_set \<theta>" for h k
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   166
  proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   167
    have *: "\<bar>k * \<theta> - h\<bar> < 1" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   168
    proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   169
      have "\<bar>k * \<theta> - h\<bar> < 1 / k"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   170
        using that by (auto simp: field_simps approx_set_def eval_nat_numeral)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   171
      also have "\<dots> \<le> 1"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   172
        using divide_le_eq_1 by fastforce
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   173
      finally show ?thesis .
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   174
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   175
    have "k > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   176
      using approx_set_def that by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   177
    have "of_int \<bar>h\<bar> \<le> \<bar>k * \<theta> - h\<bar> + \<bar>k * \<theta>\<bar>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   178
      by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   179
    also have "\<dots> < 1 + \<bar>k * \<theta>\<bar>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   180
      using * that by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   181
    also have "\<dots> \<le> H"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   182
      using Kb [OF that] \<open>k>0\<close> by (auto simp add: H_def abs_if mult_right_mono mult_less_0_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   183
    finally show ?thesis .
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   184
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   185
  have "approx_set \<theta> \<subseteq> {-(ceiling H)..ceiling H} \<times> {0..K}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   186
    using Hb Kb k0 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   187
    apply (simp add: subset_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   188
    by (smt (verit, best) ceiling_add_of_int less_ceiling_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   189
  then have "finite (approx_set \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   190
    by (meson finite_SigmaI finite_atLeastAtMost_int finite_subset)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   191
  then show False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   192
    using assms by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   193
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   194
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   195
text \<open>Theorem 7.4(b,d)\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   196
theorem rational_iff_finite_approx_set:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   197
  shows "\<theta> \<in> \<rat> \<longleftrightarrow> finite (approx_set \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   198
proof
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   199
  assume "\<theta> \<in> \<rat>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   200
  then obtain a b where eq: "\<theta> = of_int a / of_int b" and "b>0" and "coprime a b"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   201
    by (meson Rats_cases')
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   202
  then have ab: "(a,b) \<in> approx_set \<theta>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   203
    by (auto simp: approx_set_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   204
  show "finite (approx_set \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   205
  proof (rule ccontr)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   206
    assume "infinite (approx_set \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   207
    then obtain h k where "(h,k) \<in> approx_set \<theta>" "k > b" "k>0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   208
      using infinite_approx_set by (smt (verit, best))
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   209
    then have "coprime h k" and hk: "\<bar>a/b - h/k\<bar> < 1 / (of_int k)\<^sup>2"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   210
      by (auto simp: approx_set_def eq)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   211
    have False if "a * k = h * b"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   212
    proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   213
      have "b dvd k"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   214
        using that \<open>coprime a b\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   215
        by (metis coprime_commute coprime_dvd_mult_right_iff dvd_triv_right)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   216
      then obtain d where "k = b * d"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   217
        by (metis dvd_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   218
      then have "h = a * d"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   219
        using \<open>0 < b\<close> that by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   220
      then show False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   221
        using \<open>0 < b\<close> \<open>b < k\<close> \<open>coprime h k\<close> \<open>k = b * d\<close> by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   222
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   223
    then have 0: "0 < \<bar>a*k - b*h\<bar>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   224
      by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   225
    have "\<bar>a*k - b*h\<bar> < b/k"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   226
      using \<open>k>0\<close> \<open>b>0\<close> hk by (simp add: field_simps eval_nat_numeral)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   227
    also have "\<dots> < 1"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   228
      by (simp add: \<open>0 < k\<close> \<open>b < k\<close>)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   229
    finally show False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   230
      using 0 by linarith
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   231
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   232
next
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   233
  assume fin: "finite (approx_set \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   234
  show "\<theta> \<in> \<rat>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   235
  proof (rule ccontr)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   236
    assume irr: "\<theta> \<notin> \<rat>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   237
    define A where "A \<equiv> ((\<lambda>(h,k). \<bar>\<theta> - h/k\<bar>) ` approx_set \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   238
    let ?\<alpha> = "Min A"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   239
    have "0 \<notin> A"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   240
      using irr by (auto simp: A_def approx_set_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   241
    moreover have "\<forall>x\<in>A. x\<ge>0" and A: "finite A" "A \<noteq> {}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   242
      using approx_set_nonempty by (auto simp: A_def fin)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   243
    ultimately have \<alpha>: "?\<alpha> > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   244
      using Min_in by force 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   245
    then obtain N where N: "real N > 1 / ?\<alpha>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   246
      using reals_Archimedean2 by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   247
    have "0 < 1 / ?\<alpha>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   248
      using \<alpha> by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   249
    also have "\<dots> < real N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   250
      by (fact N)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   251
    finally have "N > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   252
      by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   253
    from N have "1/N < ?\<alpha>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   254
      by (simp add: \<alpha> divide_less_eq mult.commute)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   255
    then obtain h k where "coprime h k" "0 < k" "k \<le> int N" "\<bar>of_int k * \<theta> - of_int h\<bar> < 1/N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   256
      by (metis Dirichlet_approx_coprime \<alpha> N divide_less_0_1_iff less_le not_less_iff_gr_or_eq of_nat_0_le_iff of_nat_le_iff of_nat_0)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   257
    then have \<section>: "\<bar>\<theta> - h/k\<bar> < 1 / (k*N)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   258
      by (simp add: field_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   259
    also have "\<dots> \<le> 1/k\<^sup>2"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   260
      using \<open>k \<le> int N\<close> by (simp add: eval_nat_numeral divide_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   261
    finally have hk_in: "(h,k) \<in> approx_set \<theta>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   262
      using \<open>0 < k\<close> \<open>coprime h k\<close> by (auto simp: approx_set_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   263
    then have "\<bar>\<theta> - h/k\<bar> \<in> A"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   264
      by (auto simp: A_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   265
    moreover have "1 / real_of_int (k * int N) < ?\<alpha>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   266
    proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   267
      have "1 / real_of_int (k * int N) = 1 / real N / of_int k"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   268
        by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   269
      also have "\<dots> < ?\<alpha> / of_int k"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   270
        using \<open>k > 0\<close> \<alpha> \<open>N > 0\<close> N by (intro divide_strict_right_mono) (auto simp: field_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   271
      also have "\<dots> \<le> ?\<alpha> / 1"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   272
        using \<alpha> \<open>k > 0\<close> by (intro divide_left_mono) auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   273
      finally show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   274
        by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   275
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   276
    ultimately show False using A \<section> by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   277
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   278
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   279
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   280
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   281
text \<open>No formalisation of Liouville's Approximation Theorem because this is already in the AFP
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   282
as Liouville\_Numbers. Apostol's Theorem 7.5 should be exactly the theorem
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   283
liouville\_irrational\_algebraic. There is a minor discrepancy in the definition 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   284
of "Liouville number" between Apostol and Eberl: he requires the denominator to be 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   285
positive, while Eberl require it to exceed 1.\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   286
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   287
section \<open>Kronecker's Approximation Theorem: the One-dimensional Case\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   288
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   289
lemma frac_int_mult: 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   290
  assumes "m > 0" and le: "1-frac r \<le> 1/m"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   291
  shows "1 - frac (of_int m * r) = m * (1 - frac r)" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   292
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   293
  have "frac (of_int m * r) = 1 - m * (1 - frac r)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   294
  proof (subst frac_unique_iff, intro conjI)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   295
    show "of_int m * r - (1 - of_int m * (1 - frac r)) \<in> \<int>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   296
      by (simp add: algebra_simps frac_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   297
  qed (use assms in \<open>auto simp: divide_simps mult_ac frac_lt_1\<close>)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   298
  then show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   299
    by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   300
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   301
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   302
text \<open>Concrete statement of Theorem 7.7, and the real proof\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   303
theorem Kronecker_approx_1_explicit:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   304
  fixes \<theta> :: real
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   305
  assumes "\<theta> \<notin> \<rat>" and \<alpha>: "0 \<le> \<alpha>" "\<alpha> \<le> 1" and "\<epsilon> > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   306
  obtains k where "k>0" "\<bar>frac(real k * \<theta>) - \<alpha>\<bar> < \<epsilon>"  
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   307
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   308
  obtain N::nat where "1/N < \<epsilon>" "N > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   309
    by (metis \<open>\<epsilon> > 0\<close> gr_zeroI inverse_eq_divide real_arch_inverse)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   310
  then obtain h k where "0 < k" and hk: "\<bar>of_int k * \<theta> - of_int h\<bar> < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   311
    using Dirichlet_approx that by (metis less_trans)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   312
  have irrat: "of_int n * \<theta> \<in> \<rat> \<Longrightarrow> n = 0" for n
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   313
    by (metis Rats_divide Rats_of_int assms(1) nonzero_mult_div_cancel_left of_int_0_eq_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   314
  then consider "of_int k * \<theta> < of_int h" | "of_int k * \<theta> > of_int h"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   315
    by (metis Rats_of_int \<open>0 < k\<close> less_irrefl linorder_neqE_linordered_idom)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   316
  then show thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   317
  proof cases
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   318
    case 1
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   319
    define \<xi> where "\<xi> \<equiv> 1 - frac (of_int k * \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   320
    have pos: "\<xi> > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   321
      by (simp add: \<xi>_def frac_lt_1)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   322
    define N where "N \<equiv> \<lfloor>1/\<xi>\<rfloor>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   323
    have "N > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   324
      by (simp add: N_def \<xi>_def frac_lt_1)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   325
    have False if "1/\<xi> \<in> \<int>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   326
    proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   327
      from that of_int_ceiling
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   328
      obtain r where r: "of_int r = 1/\<xi>" by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   329
      then obtain s where s: "of_int k * \<theta> = of_int s + 1 - 1/r"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   330
        by (simp add: \<xi>_def frac_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   331
      from r pos s \<open>k > 0\<close> have "\<theta> = (of_int s + 1 - 1/r) / k"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   332
        by (auto simp: field_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   333
      with assms show False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   334
        by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   335
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   336
    then have N0: "N < 1/\<xi>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   337
      unfolding N_def by (metis Ints_of_int floor_correct less_le)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   338
    then have N2: "1/(N+1) < \<xi>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   339
      unfolding N_def by (smt (verit) divide_less_0_iff divide_less_eq floor_correct mult.commute pos)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   340
    have "\<xi> * (N+1) > 1"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   341
      by (smt (verit) N2 \<open>0 < N\<close> of_int_1_less_iff pos_divide_less_eq)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   342
    then have ex: "\<exists>m. int m \<le> N+1 \<and> 1-\<alpha> < m * \<xi>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   343
      by (smt (verit, best) \<open>0 < N\<close> \<open>0 \<le> \<alpha>\<close> floor_of_int floor_of_nat mult.commute of_nat_nat)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   344
    define m where "m \<equiv> LEAST m. int m \<le> N+1 \<and> 1-\<alpha> < m * \<xi>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   345
    have m: "int m \<le> N+1 \<and> 1-\<alpha> < m * \<xi>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   346
      using LeastI_ex [OF ex] unfolding m_def by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   347
    have "m > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   348
      using m gr0I \<open>\<alpha> \<le> 1\<close> by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   349
    have k\<theta>: "\<xi> < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   350
      using hk 1 by (smt (verit, best) floor_eq_iff frac_def \<xi>_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   351
    show thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   352
    proof (cases "m=1")
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   353
      case True
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   354
      then have "\<bar>frac (real (nat k) * \<theta>) - \<alpha>\<bar> < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   355
        using m \<open>\<alpha> \<le> 1\<close> \<open>0 < k\<close> \<xi>_def k\<theta> by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   356
      with \<open>0 < k\<close> zero_less_nat_eq that show thesis by blast 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   357
    next
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   358
      case False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   359
      with \<open>0 < m\<close> have "m>1" by linarith
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   360
      have "\<xi> < 1 / N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   361
        by (metis N0 \<open>0 < N\<close> mult_of_int_commute of_int_pos pos pos_less_divide_eq)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   362
      also have "\<dots> \<le> 1 / (real m - 1)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   363
        using \<open>m > 1\<close> m by (simp add: divide_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   364
      finally have "\<xi> < 1 / (real m - 1)" .
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   365
      then have m1_eq: "(int m - 1) * \<xi> = 1 - frac (of_int ((int m - 1) * k) * \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   366
        using frac_int_mult [of "(int m - 1)" "k * \<theta>"] \<open>1 < m\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   367
        by (simp add: \<xi>_def mult.assoc)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   368
      then
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   369
      have m1_eq': "frac (of_int ((int m - 1) * k) * \<theta>) = 1 - (int m - 1) * \<xi>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   370
        by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   371
      moreover have "(m - Suc 0) * \<xi> \<le> 1-\<alpha>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   372
        using Least_le [where k="m-Suc 0"] m
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   373
        by (smt (verit, best) Suc_n_not_le_n Suc_pred \<open>0 < m\<close> m_def of_nat_le_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   374
      ultimately have le\<alpha>: " \<alpha> \<le> frac (of_int ((int m - 1) * k) * \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   375
        by (simp add: Suc_leI \<open>0 < m\<close> of_nat_diff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   376
      moreover have "m * \<xi> + frac (of_int ((int m - 1) * k) * \<theta>) = \<xi> + 1"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   377
        by (subst m1_eq') (simp add: \<xi>_def algebra_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   378
      ultimately have "\<bar>frac ((int (m - 1) * k) * \<theta>) - \<alpha>\<bar> < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   379
        by (smt (verit, best) One_nat_def Suc_leI \<open>0 < m\<close> int_ops(2) k\<theta> m of_nat_diff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   380
      with that show thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   381
        by (metis \<open>0 < k\<close> \<open>1 < m\<close> mult_pos_pos of_int_of_nat_eq of_nat_mult pos_int_cases zero_less_diff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   382
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   383
  next
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   384
    case 2 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   385
    define \<xi> where "\<xi> \<equiv> frac (of_int k * \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   386
    have recip_frac: False if "1/\<xi> \<in> \<int>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   387
    proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   388
      have "frac (of_int k * \<theta>) \<in> \<rat>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   389
        using that unfolding \<xi>_def
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   390
        by (metis Ints_cases Rats_1 Rats_divide Rats_of_int div_by_1 divide_divide_eq_right mult_cancel_right2)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   391
      then show False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   392
        using \<open>0 < k\<close> frac_in_Rats_iff irrat by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   393
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   394
    have pos: "\<xi> > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   395
      by (metis \<xi>_def Ints_0 division_ring_divide_zero frac_unique_iff less_le recip_frac)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   396
    define N where "N \<equiv> \<lfloor>1 / \<xi>\<rfloor>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   397
    have "N > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   398
      unfolding N_def
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   399
      by (smt (verit) \<xi>_def divide_less_eq_1_pos floor_less_one frac_lt_1 pos) 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   400
    have N0: "N < 1 / \<xi>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   401
      unfolding N_def by (metis Ints_of_int floor_eq_iff less_le recip_frac)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   402
    then have N2: "1/(N+1) < \<xi>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   403
      unfolding N_def
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   404
      by (smt (verit, best) divide_less_0_iff divide_less_eq floor_correct mult.commute pos)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   405
    have "\<xi> * (N+1) > 1"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   406
      by (smt (verit) N2 \<open>0 < N\<close> of_int_1_less_iff pos_divide_less_eq)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   407
    then have ex: "\<exists>m. int m \<le> N+1 \<and> \<alpha> < m * \<xi>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   408
      by (smt (verit, best) mult.commute \<open>\<alpha> \<le> 1\<close> \<open>0 < N\<close> of_int_of_nat_eq pos_int_cases)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   409
    define m where "m \<equiv> LEAST m. int m \<le> N+1 \<and> \<alpha> < m * \<xi>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   410
    have m: "int m \<le> N+1 \<and> \<alpha> < m * \<xi>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   411
      using LeastI_ex [OF ex] unfolding m_def by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   412
    have "m > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   413
      using \<open>0 \<le> \<alpha>\<close> m gr0I by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   414
    have k\<theta>: "\<xi> < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   415
      using hk 2 unfolding \<xi>_def by (smt (verit, best) floor_eq_iff frac_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   416
    have mk_eq: "frac (of_int (m*k) * \<theta>) = m * frac (of_int k * \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   417
      if "m>0" "frac (of_int k * \<theta>) < 1/m" for m k
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   418
    proof (subst frac_unique_iff , intro conjI)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   419
      show "real_of_int (m * k) * \<theta> - real_of_int m * frac (real_of_int k * \<theta>) \<in> \<int>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   420
        by (simp add: algebra_simps frac_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   421
    qed (use that in \<open>auto simp: divide_simps mult_ac\<close>)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   422
    show thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   423
    proof (cases "m=1")
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   424
      case True
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   425
      then have "\<bar>frac (real (nat k) * \<theta>) - \<alpha>\<bar> < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   426
        using m \<alpha> \<open>0 < k\<close> \<xi>_def k\<theta> by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   427
      with \<open>0 < k\<close> zero_less_nat_eq that show ?thesis by blast 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   428
    next
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   429
      case False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   430
      with \<open>0 < m\<close> have "m>1" by linarith
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   431
      with \<open>0 < k\<close> have mk_pos:"(m - Suc 0) * nat k > 0" by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   432
      have "real_of_int (int m - 1) < 1 / frac (real_of_int k * \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   433
        using N0 \<xi>_def m by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   434
      then
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   435
      have m1_eq: "(int m - 1) * \<xi> = frac (((int m - 1) * k) * \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   436
        using m mk_eq [of "int m-1" k] pos \<open>m>1\<close> by (simp add: divide_simps mult_ac \<xi>_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   437
      moreover have "(m - Suc 0) * \<xi> \<le> \<alpha>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   438
        using Least_le [where k="m-Suc 0"] m
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   439
        by (smt (verit, best) Suc_n_not_le_n Suc_pred \<open>0 < m\<close> m_def of_nat_le_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   440
      ultimately have le\<alpha>: "frac (of_int ((int m - 1) * k) * \<theta>) \<le> \<alpha>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   441
        by (simp add: Suc_leI \<open>0 < m\<close> of_nat_diff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   442
      moreover have "(m * \<xi> - frac (of_int ((int m - 1) * k) * \<theta>)) < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   443
        by (metis m1_eq add_diff_cancel_left' diff_add_cancel k\<theta> left_diff_distrib' 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   444
            mult_cancel_right2 of_int_1 of_int_diff of_int_of_nat_eq)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   445
      ultimately have "\<bar>frac (real( (m - 1) * nat k) * \<theta>) - \<alpha>\<bar> < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   446
        using \<open>0 < k\<close> \<open>0 < m\<close> by simp (smt (verit, best) One_nat_def Suc_leI m of_nat_1 of_nat_diff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   447
      with  \<open>m > 0\<close> that show thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   448
        using mk_pos One_nat_def by presburger
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   449
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   450
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   451
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   452
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   453
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   454
text \<open>Theorem 7.7 expressed more abstractly using @{term closure}\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   455
corollary Kronecker_approx_1:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   456
  fixes \<theta> :: real
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   457
  assumes "\<theta> \<notin> \<rat>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   458
  shows "closure (range (\<lambda>n. frac (real n * \<theta>))) = {0..1}"  (is "?C = _")
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   459
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   460
  have "\<exists>k>0. \<bar>frac(real k * \<theta>) - \<alpha>\<bar> < \<epsilon>" if "0 \<le> \<alpha>" "\<alpha> \<le> 1" "\<epsilon> > 0" for \<alpha> \<epsilon>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   461
    by (meson Kronecker_approx_1_explicit assms that)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   462
  then have "x \<in> ?C" if "0 \<le> x" "x \<le> 1" for x :: real
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   463
    using that by (auto simp add: closure_approachable dist_real_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   464
  moreover 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   465
  have "(range (\<lambda>n. frac (real n * \<theta>))) \<subseteq> {0..1}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   466
    by (smt (verit) atLeastAtMost_iff frac_unique_iff image_subset_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   467
  then have "?C \<subseteq> {0..1}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   468
    by (simp add: closure_minimal)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   469
  ultimately show ?thesis by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   470
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   471
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   472
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   473
text \<open>The next theorem removes the restriction $0 \leq \alpha \leq 1$.\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   474
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   475
text \<open>Theorem 7.8\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   476
corollary sequence_of_fractional_parts_is_dense:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   477
  fixes \<theta> :: real
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   478
  assumes "\<theta> \<notin> \<rat>" "\<epsilon> > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   479
  obtains h k where "k > 0" "\<bar>of_int k * \<theta> - of_int h - \<alpha>\<bar> < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   480
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   481
  obtain k where "k>0" "\<bar>frac(real k * \<theta>) - frac \<alpha>\<bar> < \<epsilon>"  
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   482
    by (metis Kronecker_approx_1_explicit assms frac_ge_0 frac_lt_1 less_le_not_le)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   483
  then have "\<bar>real_of_int k * \<theta> - real_of_int (\<lfloor>k * \<theta>\<rfloor> - \<lfloor>\<alpha>\<rfloor>) - \<alpha>\<bar> < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   484
    by (auto simp: frac_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   485
  then show thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   486
    by (meson \<open>0 < k\<close> of_nat_0_less_iff that)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   487
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   488
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   489
section \<open>Extension of Kronecker's Theorem to Simultaneous Approximation\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   490
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   491
subsection \<open>Towards Lemma 1\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   492
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   493
lemma integral_exp: 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   494
  assumes  "T \<ge> 0" "a\<noteq>0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   495
  shows "integral {0..T} (\<lambda>t. exp(a * complex_of_real t)) = (exp(a * of_real T) - 1) / a"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   496
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   497
  have "\<And>t. t \<in> {0..T} \<Longrightarrow> ((\<lambda>x. exp (a * x) / a) has_vector_derivative exp (a * t)) (at t within {0..T})"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   498
    using assms
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   499
    by (intro derivative_eq_intros has_complex_derivative_imp_has_vector_derivative [unfolded o_def] | simp)+
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   500
  then have "((\<lambda>t. exp(a * of_real t)) has_integral exp(a * complex_of_real T)/a - exp(a * of_real 0)/a)  {0..T}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   501
    by (meson fundamental_theorem_of_calculus \<open>T \<ge> 0\<close>)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   502
  then show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   503
    by (simp add: diff_divide_distrib integral_unique)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   504
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   505
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   506
lemma Kronecker_simult_aux1:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   507
  fixes \<eta>:: "nat \<Rightarrow> real" and c:: "nat \<Rightarrow> complex" and N::nat
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   508
  assumes inj: "inj_on \<eta> {..N}" and "k \<le> N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   509
  defines "f \<equiv> \<lambda>t. \<Sum>r\<le>N. c r * exp(\<i> * of_real t * \<eta> r)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   510
  shows "((\<lambda>T. (1/T) * integral {0..T} (\<lambda>t. f t * exp(-\<i> * of_real t * \<eta> k))) \<longlongrightarrow> c k) at_top"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   511
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   512
  define F where "F \<equiv> \<lambda>k t. f t * exp(-\<i> * of_real t * \<eta> k)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   513
  have f: "F k = (\<lambda>t. \<Sum>r\<le>N. c r * exp(\<i> * (\<eta> r - \<eta> k) * of_real t))" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   514
    by (simp add: F_def f_def sum_distrib_left field_simps exp_diff exp_minus)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   515
  have *: "integral {0..T} (F k)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   516
      = c k * T + (\<Sum>r \<in> {..N}-{k}. c r * integral {0..T} (\<lambda>t. exp(\<i> * (\<eta> r - \<eta> k) * of_real t)))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   517
    if "T > 0" for T
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   518
    using \<open>k \<le> N\<close> that
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   519
    by (simp add: f integral_sum integrable_continuous_interval continuous_intros Groups_Big.sum_diff scaleR_conv_of_real)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   520
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   521
  have **: "(1/T) * integral {0..T} (F k)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   522
       = c k + (\<Sum>r \<in> {..N}-{k}. c r * (exp(\<i> * (\<eta> r - \<eta> k) * of_real T) - 1) / (\<i> * (\<eta> r - \<eta> k) * of_real T))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   523
    if "T > 0" for T
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   524
  proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   525
    have I: "integral {0..T} (\<lambda>t. exp (\<i> * (complex_of_real t * \<eta> r) - \<i> * (complex_of_real t * \<eta> k))) 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   526
           = (exp(\<i> * (\<eta> r - \<eta> k) * T) - 1) / (\<i> * (\<eta> r - \<eta> k))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   527
      if "r \<le> N" "r \<noteq> k" for r
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   528
      using that \<open>k \<le> N\<close> inj \<open>T > 0\<close> integral_exp [of T "\<i> * (\<eta> r - \<eta> k)"] 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   529
      by (simp add: inj_on_eq_iff algebra_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   530
    show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   531
      using that by (subst *) (auto simp add: algebra_simps sum_divide_distrib I)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   532
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   533
  have "((\<lambda>T. c r * (exp(\<i> * (\<eta> r - \<eta> k) * of_real T) - 1) / (\<i> * (\<eta> r - \<eta> k) * of_real T)) \<longlongrightarrow> 0) at_top"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   534
    for r
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   535
  proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   536
    have "((\<lambda>x. (cos ((\<eta> r - \<eta> k) * x) - 1) / x) \<longlongrightarrow> 0) at_top"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   537
         "((\<lambda>x. sin ((\<eta> r - \<eta> k) * x) / x) \<longlongrightarrow> 0) at_top"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   538
      by real_asymp+
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   539
    hence "((\<lambda>T. (exp (\<i> * (\<eta> r - \<eta> k) * of_real T) - 1) / of_real T) \<longlongrightarrow> 0) at_top"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   540
      by (simp add: tendsto_complex_iff Re_exp Im_exp)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   541
    from tendsto_mult[OF this tendsto_const[of "c r / (\<i> * (\<eta> r - \<eta> k))"]] show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   542
      by (simp add: field_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   543
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   544
  then have "((\<lambda>T. c k + (\<Sum>r \<in> {..N}-{k}. c r * (exp(\<i> * (\<eta> r - \<eta> k) * of_real T) - 1) / 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   545
                  (\<i> * (\<eta> r - \<eta> k) * of_real T))) \<longlongrightarrow> c k + 0) at_top"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   546
    by (intro tendsto_add tendsto_null_sum) auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   547
  also have "?this \<longleftrightarrow> ?thesis"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   548
  proof (rule filterlim_cong)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   549
    show "\<forall>\<^sub>F x in at_top. c k + (\<Sum>r\<in>{..N} - {k}. c r * (exp (\<i> * of_real (\<eta> r - \<eta> k) * of_real x) - 1) /
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   550
            (\<i> * of_real (\<eta> r - \<eta> k) * of_real x)) = 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   551
          1 / of_real x * integral {0..x} (\<lambda>t. f t * exp (- \<i> * of_real t * of_real (\<eta> k)))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   552
      using eventually_gt_at_top[of 0]
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   553
    proof eventually_elim
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   554
      case (elim T)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   555
      show ?case
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   556
        using **[of T] elim by (simp add: F_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   557
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   558
  qed auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   559
  finally show ?thesis .
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   560
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   561
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   562
text \<open>the version of Lemma 1 that we actually need\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   563
lemma Kronecker_simult_aux1_strict:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   564
  fixes \<eta>:: "nat \<Rightarrow> real" and c:: "nat \<Rightarrow> complex" and N::nat
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   565
  assumes \<eta>: "inj_on \<eta> {..<N}" "0 \<notin> \<eta> ` {..<N}" and "k < N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   566
  defines "f \<equiv> \<lambda>t. 1 + (\<Sum>r<N. c r * exp(\<i> * of_real t * \<eta> r))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   567
  shows "((\<lambda>T. (1/T) * integral {0..T} (\<lambda>t. f t * exp(-\<i> * of_real t * \<eta> k))) \<longlongrightarrow> c k) at_top"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   568
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   569
  define c' where "c' \<equiv> case_nat 1 c"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   570
  define \<eta>' where "\<eta>' \<equiv> case_nat 0 \<eta>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   571
  define f' where "f' \<equiv> \<lambda>t. (\<Sum>r\<le>N. c' r * exp(\<i> * of_real t * \<eta>' r))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   572
  have "inj_on \<eta>' {..N}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   573
    using \<eta> by (auto simp: \<eta>'_def inj_on_def split: nat.split_asm)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   574
  moreover have "Suc k \<le> N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   575
    using \<open>k < N\<close> by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   576
  ultimately have "((\<lambda>T. 1 / T * integral {0..T} (\<lambda>t. (\<Sum>r\<le>N. c' r * exp (\<i> * of_real t * \<eta>' r)) *
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   577
                    exp (- \<i> * t * \<eta>' (Suc k)))) \<longlongrightarrow> c' (Suc k))
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   578
       at_top"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   579
    by (intro Kronecker_simult_aux1)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   580
  moreover have "(\<Sum>r\<le>N. c' r * exp (\<i> * of_real t * \<eta>' r)) = 1 + (\<Sum>r<N. c r * exp (\<i> * of_real t * \<eta> r))" for t
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   581
    by (simp add: c'_def \<eta>'_def sum.atMost_shift)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   582
  ultimately show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   583
    by (simp add: f_def c'_def \<eta>'_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   584
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   585
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   586
subsection \<open>Towards Lemma 2\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   587
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   588
lemma cos_monotone_aux: "\<lbrakk>\<bar>2 * pi * of_int i + x\<bar> \<le> y; y \<le> pi\<rbrakk> \<Longrightarrow> cos y \<le> cos x"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   589
  by (metis add.commute abs_ge_zero cos_abs_real cos_monotone_0_pi_le sin_cos_eq_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   590
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   591
lemma Figure7_1:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   592
  assumes "0 \<le> \<epsilon>" "\<epsilon> \<le> \<bar>x\<bar>" "\<bar>x\<bar> \<le> pi"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   593
  shows "cmod (1 + exp (\<i> * x)) \<le> cmod (1 + exp (\<i> * \<epsilon>))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   594
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   595
  have norm_eq: "sqrt (2 * (1 + cos t)) = cmod (1 + cis t)" for t
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   596
    by (simp add: norm_complex_def power2_eq_square algebra_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   597
  have "cos \<bar>x\<bar> \<le> cos \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   598
    by (rule cos_monotone_0_pi_le) (use assms in auto)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   599
  hence "sqrt (2 * (1 + cos \<bar>x\<bar>)) \<le> sqrt (2 * (1 + cos \<epsilon>))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   600
    by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   601
  also have "cos \<bar>x\<bar> = cos x"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   602
    by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   603
  finally show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   604
    unfolding norm_eq by (simp add: cis_conv_exp)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   605
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   606
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   607
lemma Kronecker_simult_aux2:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   608
  fixes \<alpha>:: "nat \<Rightarrow> real" and \<theta>:: "nat \<Rightarrow> real" and n::nat
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   609
  defines "F \<equiv> \<lambda>t. 1 + (\<Sum>r<n. exp(\<i> * of_real (2 * pi * (t * \<theta> r - \<alpha> r))))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   610
  defines "L \<equiv> Sup (range (norm \<circ> F))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   611
  shows "(\<forall>\<epsilon>>0. \<exists>t h. \<forall>r<n. \<bar>t * \<theta> r - \<alpha> r - of_int (h r)\<bar> < \<epsilon>) \<longleftrightarrow> L = Suc n" (is "?lhs = _")
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   612
proof
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   613
  assume ?lhs
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   614
  then have "\<And>k. \<exists>t h. \<forall>r<n. \<bar>t * \<theta> r - \<alpha> r - of_int (h r)\<bar> < 1 / (2 * pi * Suc k)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   615
    by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   616
  then obtain t h where th: "\<And>k r. r<n \<Longrightarrow> \<bar>t k * \<theta> r - \<alpha> r - of_int (h k r)\<bar> < 1 / (2 * pi * Suc k)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   617
    by metis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   618
  have Fle: "\<And>x. cmod (F x) \<le> real (Suc n)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   619
    by (force simp: F_def intro: order_trans [OF norm_triangle_ineq] order_trans [OF norm_sum])
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   620
  then have boundedF: "bounded (range F)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   621
    by (metis bounded_iff rangeE) 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   622
  have leL: "1 + n * cos(1 / Suc k) \<le> L" for k
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   623
  proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   624
    have *: "cos (1 / Suc k) \<le> cos (2 * pi * (t k * \<theta> r - \<alpha> r))" if "r<n" for r 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   625
    proof (rule cos_monotone_aux)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   626
      have "\<bar>2 * pi * (- h k r) + 2 * pi * (t k * \<theta> r - \<alpha> r)\<bar> \<le> \<bar>t k * \<theta> r - \<alpha> r - h k r\<bar> * 2 * pi"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   627
        by (simp add: algebra_simps abs_mult_pos abs_mult_pos')
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   628
      also have "\<dots> \<le> 1 / real (Suc k)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   629
        using th [OF that, of k] by (simp add: divide_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   630
      finally show "\<bar>2 * pi * real_of_int (- h k r) + 2 * pi * (t k * \<theta> r - \<alpha> r)\<bar> \<le> 1 / real (Suc k)" .
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   631
      have "1 / real (Suc k) \<le> 1"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   632
        by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   633
      then show "1 / real (Suc k) \<le> pi"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   634
        using pi_ge_two by linarith
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   635
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   636
    have "1 + n * cos(1 / Suc k) = 1 + (\<Sum>r<n. cos(1 / Suc k))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   637
      by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   638
    also have "\<dots> \<le> 1 + (\<Sum>r<n. cos (2 * pi * (t k * \<theta> r - \<alpha> r)))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   639
      using * by (intro add_mono sum_mono) auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   640
    also have "\<dots> \<le> Re (F(t k))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   641
      by (simp add: F_def Re_exp)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   642
    also have "\<dots> \<le> norm (F(t k))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   643
      by (simp add: complex_Re_le_cmod)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   644
    also have "\<dots> \<le> L"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   645
      by (simp add: L_def boundedF bounded_norm_le_SUP_norm)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   646
    finally show ?thesis .
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   647
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   648
  show "L = Suc n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   649
  proof (rule antisym)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   650
    show "L \<le> Suc n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   651
      using Fle by (auto simp add: L_def intro: cSup_least)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   652
    have "((\<lambda>k. 1 + real n * cos (1 / real (Suc k))) \<longlongrightarrow> 1 + real n) at_top"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   653
      by real_asymp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   654
    with LIMSEQ_le_const2 leL show "Suc n \<le> L"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   655
      by fastforce
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   656
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   657
next
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   658
  assume L: "L = Suc n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   659
  show ?lhs
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   660
  proof (rule ccontr)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   661
    assume "\<not> ?lhs"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   662
    then obtain e0 where "e0>0" and e0: "\<And>t h. \<exists>k<n. \<bar>t * \<theta> k - \<alpha> k - of_int (h k)\<bar> \<ge> e0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   663
      by (force simp: not_less)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   664
    define \<epsilon> where "\<epsilon> \<equiv> min e0 (pi/4)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   665
    have \<epsilon>: "\<And>t h. \<exists>k<n. \<bar>t * \<theta> k - \<alpha> k - of_int (h k)\<bar> \<ge> \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   666
      unfolding \<epsilon>_def using e0 min.coboundedI1 by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   667
    have \<epsilon>_bounds: "\<epsilon> > 0" "\<epsilon> < pi" "\<epsilon> \<le> pi/4"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   668
      using \<open>e0 > 0\<close> by (auto simp: \<epsilon>_def min_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   669
    with sin_gt_zero have "sin \<epsilon> > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   670
      by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   671
    then have "\<not> collinear{0, 1, exp (\<i> * \<epsilon>)}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   672
      using collinear_iff_Reals cis.sel cis_conv_exp complex_is_Real_iff by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   673
    then have "norm (1 + exp (\<i> * \<epsilon>)) < 2"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   674
      using norm_triangle_eq_imp_collinear
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   675
      by (smt (verit) linorder_not_le norm_exp_i_times norm_one norm_triangle_lt)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   676
    then obtain \<delta> where "\<delta> > 0" and \<delta>: "norm (1 + exp (\<i> * \<epsilon>)) = 2 - \<delta>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   677
      by (smt (verit, best))
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   678
    have "norm (F t) \<le> n+1-\<delta>" for t 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   679
    proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   680
      define h where "h \<equiv> \<lambda>r. round (t * \<theta> r - \<alpha> r)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   681
      define X where "X \<equiv> \<lambda>r. t * \<theta> r - \<alpha> r - h r"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   682
      have "exp (\<i> * (of_int j * (of_real pi * 2))) = 1" for j
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   683
        by (metis add_0 exp_plus_2pin exp_zero)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   684
      then have exp_X: "exp (\<i> * (2 * of_real pi * of_real (X r))) 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   685
                 = exp (\<i> * of_real (2 * pi * (t * \<theta> r - \<alpha> r)))" for r
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   686
        by (simp add: X_def right_diff_distrib exp_add exp_diff mult.commute)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   687
      have norm_pr_12: "X r \<in> {-1/2..<1/2}" for r
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   688
        apply (simp add: X_def h_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   689
        by (smt (verit, best) abs_of_nonneg half_bounded_equal of_int_round_abs_le of_int_round_gt)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   690
      obtain k where "k<n" and 1: "\<bar>X k\<bar> \<ge> \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   691
        using X_def \<epsilon> [of t h] by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   692
      have 2: "2*pi \<ge> 1"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   693
        using pi_ge_two by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   694
      have "\<bar>2 * pi * X k\<bar> \<ge> \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   695
        using mult_mono [OF 2 1] pi_ge_zero by linarith
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   696
      moreover
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   697
      have "\<bar>2 * pi * X k\<bar> \<le> pi"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   698
        using norm_pr_12 [of k] apply (simp add: abs_if field_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   699
        by (smt (verit, best) divide_le_eq_1_pos divide_minus_left m2pi_less_pi nonzero_mult_div_cancel_left)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   700
      ultimately
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   701
      have *: "norm (1 + exp (\<i> * of_real (2 * pi * X k))) \<le> norm (1 + exp (\<i> * \<epsilon>))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   702
        using Figure7_1[of \<epsilon> "2 * pi * X k"] \<epsilon>_bounds by linarith
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   703
      have "norm (F t) = norm (1 + (\<Sum>r<n. exp(\<i> * of_real (2 * pi * (X r)))))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   704
        by (auto simp: F_def exp_X)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   705
      also have "\<dots> \<le> norm (1 + exp(\<i> * of_real (2 * pi * X k)) + (\<Sum>r \<in> {..<n}-{k}. exp(\<i> * of_real (2 * pi * X r))))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   706
        by (simp add: comm_monoid_add_class.sum.remove [where x=k] \<open>k < n\<close> algebra_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   707
      also have "\<dots> \<le> norm (1 + exp(\<i> * of_real (2 * pi * X k))) + (\<Sum>r \<in> {..<n}-{k}. norm (exp(\<i> * of_real (2 * pi * X r))))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   708
        by (intro norm_triangle_mono sum_norm_le order_refl)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   709
      also have "\<dots> \<le> (2 - \<delta>) + (n - 1)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   710
        using \<open>k < n\<close> \<delta> 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   711
        by simp (metis "*" mult_2 of_real_add of_real_mult)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   712
      also have "\<dots> = n + 1 - \<delta>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   713
        using \<open>k < n\<close> by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   714
      finally show ?thesis .
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   715
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   716
    then have "L \<le> 1 + real n - \<delta>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   717
      by (auto simp: L_def intro: cSup_least)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   718
    with L \<open>\<delta> > 0\<close> show False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   719
      by linarith
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   720
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   721
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   722
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   723
subsection \<open>Towards lemma 3\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   724
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   725
text \<open>The text doesn't say so, but the generated polynomial needs to be "clean":
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   726
all coefficients nonzero, and with no exponent string mentioned more than once.
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   727
And no constant terms (with all exponents zero).\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   728
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   729
text \<open>Some tools for combining integer-indexed sequences or splitting them into parts\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   730
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   731
lemma less_sum_nat_iff:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   732
  fixes b::nat and k::nat
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   733
  shows "b < (\<Sum>i<k. a i) \<longleftrightarrow> (\<exists>j<k. (\<Sum>i<j. a i) \<le> b \<and> b < (\<Sum>i<j. a i) + a j)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   734
proof (induction k arbitrary: b)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   735
  case (Suc k)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   736
  then show ?case
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   737
    by (simp add: less_Suc_eq) (metis not_less trans_less_add1)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   738
qed auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   739
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   740
lemma less_sum_nat_iff_uniq:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   741
  fixes b::nat and k::nat
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   742
  shows "b < (\<Sum>i<k. a i) \<longleftrightarrow> (\<exists>!j. j<k \<and> (\<Sum>i<j. a i) \<le> b \<and> b < (\<Sum>i<j. a i) + a j)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   743
  unfolding less_sum_nat_iff by (meson leD less_sum_nat_iff nat_neq_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   744
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   745
definition part :: "(nat \<Rightarrow> nat) \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   746
  where "part a k b \<equiv> (THE j. j<k \<and> (\<Sum>i<j. a i) \<le> b \<and> b < (\<Sum>i<j. a i) + a j)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   747
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   748
lemma part: 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   749
  "b < (\<Sum>i<k. a i) \<longleftrightarrow> (let j = part a k b in j < k \<and> (\<Sum>i < j. a i) \<le> b \<and> b < (\<Sum>i < j. a i) + a j)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   750
  (is "?lhs = ?rhs")
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   751
proof
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   752
  assume ?lhs
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   753
  then show ?rhs
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   754
    unfolding less_sum_nat_iff_uniq part_def by (metis (no_types, lifting) theI')
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   755
qed (auto simp: less_sum_nat_iff Let_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   756
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   757
lemma part_Suc: "part a (Suc k) b = (if sum a {..<k} \<le> b \<and> b < sum a {..<k} + a k then k else part a k b)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   758
  using leD 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   759
  by (fastforce simp: part_def less_Suc_eq less_sum_nat_iff conj_disj_distribR cong: conj_cong)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   760
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   761
text \<open>The polynomial expansions used in Lemma 3\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   762
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   763
definition gpoly :: "[nat, nat\<Rightarrow>complex, nat, nat\<Rightarrow>nat, [nat,nat]\<Rightarrow>nat] \<Rightarrow> complex"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   764
  where "gpoly n x N a r \<equiv> (\<Sum>k<N. a k * (\<Prod>i<n. x i ^ r k i))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   765
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   766
lemma gpoly_cong:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   767
  assumes "\<And>k. k < N \<Longrightarrow> a' k = a k" "\<And>k i. \<lbrakk>k < N; i<n\<rbrakk> \<Longrightarrow> r' k i = r k i"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   768
  shows "gpoly n x N a r = gpoly n x N a' r'"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   769
  using assms by (auto simp: gpoly_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   770
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   771
lemma gpoly_inc: "gpoly n x N a r = gpoly (Suc n) x N a (\<lambda>k. (r k)(n:=0))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   772
  by (simp add: gpoly_def algebra_simps sum_distrib_left)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   773
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   774
lemma monom_times_gpoly: "gpoly n x N a r * x n ^ q = gpoly (Suc n) x N a (\<lambda>k. (r k)(n:=q))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   775
  by (simp add: gpoly_def algebra_simps sum_distrib_left)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   776
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   777
lemma const_times_gpoly: "e * gpoly n x N a r = gpoly n x N ((*)e \<circ> a) r"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   778
  by (simp add: gpoly_def sum_distrib_left mult.assoc)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   779
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   780
lemma one_plus_gpoly: "1 + gpoly n x N a r = gpoly n x (Suc N) (a(N:=1)) (r(N:=(\<lambda>_. 0)))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   781
  by (simp add: gpoly_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   782
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   783
lemma gpoly_add:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   784
  "gpoly n x N a r + gpoly n x N' a' r' 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   785
 = gpoly n x (N+N') (\<lambda>k. if k<N then a k else a' (k-N)) (\<lambda>k. if k<N then r k else r' (k-N))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   786
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   787
  have "{..<N+N'} = {..<N} \<union> {N..<N+N'}" "{..<N} \<inter> {N..<N + N'} = {}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   788
    by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   789
  then show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   790
    by (simp add: gpoly_def sum.union_disjoint sum.atLeastLessThan_shift_0[of _ N] atLeast0LessThan)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   791
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   792
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   793
lemma gpoly_sum:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   794
  fixes n Nf af rf p
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   795
  defines "N \<equiv> sum Nf {..<p}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   796
  defines "a \<equiv> \<lambda>k. let q = (part Nf p k) in af q (k - sum Nf {..<q})"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   797
  defines "r \<equiv> \<lambda>k. let q = (part Nf p k) in rf q (k - sum Nf {..<q})"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   798
  shows "(\<Sum>q<p. gpoly n x (Nf q) (af q) (rf q)) = gpoly n x N a r"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   799
  unfolding N_def a_def r_def
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   800
proof (induction p)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   801
  case 0
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   802
  then show ?case
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   803
    by (simp add: gpoly_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   804
next
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   805
  case (Suc p)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   806
  then show ?case 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   807
    by (auto simp: gpoly_add Let_def part_Suc intro: gpoly_cong)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   808
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   809
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   810
text \<open>For excluding constant terms: with all exponents zero\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   811
definition nontriv_exponents :: "[nat, nat, [nat,nat]\<Rightarrow>nat] \<Rightarrow> bool"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   812
  where "nontriv_exponents n N r \<equiv> \<forall>k<N. \<exists>i<n. r k i \<noteq> 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   813
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   814
lemma nontriv_exponents_add: 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   815
  "\<lbrakk>nontriv_exponents n M r; nontriv_exponents (Suc n) N r'\<rbrakk> \<Longrightarrow> 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   816
   nontriv_exponents (Suc n) (M + N) (\<lambda>k. if k<M then r k else r' (k-M))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   817
  by (force simp add: nontriv_exponents_def less_Suc_eq)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   818
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   819
lemma nontriv_exponents_sum:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   820
  assumes "\<And>q. q < p \<Longrightarrow> nontriv_exponents n (N q) (r q)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   821
  shows "nontriv_exponents n (sum N {..<p}) (\<lambda>k. let q = part N p k in r q (k - sum N {..<q}))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   822
  using assms by (simp add: nontriv_exponents_def less_diff_conv2 part Let_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   823
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   824
definition uniq_exponents :: "[nat, nat, [nat,nat]\<Rightarrow>nat] \<Rightarrow> bool"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   825
  where "uniq_exponents n N r \<equiv> \<forall>k<N. \<forall>k'<k. \<exists>i<n. r k i \<noteq> r k' i"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   826
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   827
lemma uniq_exponents_inj: "uniq_exponents n N r \<Longrightarrow> inj_on r {..<N}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   828
  by (smt (verit, best) inj_on_def lessThan_iff linorder_cases uniq_exponents_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   829
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   830
text \<open>All coefficients must be nonzero\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   831
definition nonzero_coeffs :: "[nat, nat\<Rightarrow>nat] \<Rightarrow> bool"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   832
  where "nonzero_coeffs N a \<equiv> \<forall>k<N. a k \<noteq> 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   833
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   834
text \<open>Any polynomial expansion can be cleaned up, removing zero coeffs, etc.\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   835
lemma gpoly_uniq_exponents:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   836
  obtains N' a' r' 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   837
  where "\<And>x. gpoly n x N a r = gpoly n x N' a' r'" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   838
        "uniq_exponents n N' r'" "nonzero_coeffs N' a'" "N' \<le> N" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   839
        "nontriv_exponents n N r \<Longrightarrow> nontriv_exponents n N' r'" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   840
proof (cases "\<forall>k<N. a k = 0")
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   841
  case True
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   842
  show thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   843
  proof
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   844
    show "gpoly n x N a r = gpoly n x 0 a r" for x
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   845
      by (auto simp: gpoly_def True)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   846
  qed (auto simp: uniq_exponents_def nonzero_coeffs_def nontriv_exponents_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   847
next
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   848
  case False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   849
  define cut where "cut f i \<equiv> if i<n then f i else (0::nat)" for f i
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   850
  define R where "R \<equiv> cut ` r ` ({..<N} \<inter> {k. a k > 0})"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   851
  define N' where "N' \<equiv> card R"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   852
  define r' where "r' \<equiv> from_nat_into R"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   853
  define a' where "a' \<equiv> \<lambda>k'. \<Sum>k<N. if r' k' = cut (r k) then a k else 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   854
  have "finite R"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   855
    using R_def by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   856
  then have bij: "bij_betw r' {..<N'} R"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   857
    using bij_betw_from_nat_into_finite N'_def r'_def by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   858
  have 1: "card {i. i < N' \<and> r' i = cut (r k)} = Suc 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   859
    if "k < N" "a k > 0" for k
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   860
  proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   861
    have "card {i. i < N' \<and> r' i = cut (r k)} \<le> Suc 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   862
      using bij by (simp add: card_le_Suc0_iff_eq bij_betw_iff_bijections Ball_def) metis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   863
    moreover have "card {i. i < N' \<and> r' i = cut (r k)} > 0" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   864
      using bij that by (auto simp: card_gt_0_iff bij_betw_iff_bijections R_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   865
    ultimately show "card {i. i < N' \<and> r' i = cut (r k)} = Suc 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   866
      using that by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   867
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   868
  show thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   869
  proof
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   870
    have "\<exists>i<n. r' k i \<noteq> r' k' i" if "k < N'" and "k' < k" for k k'
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   871
    proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   872
      have "k' < N'"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   873
        using order.strict_trans that by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   874
      then have "r' k \<noteq> r' k'"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   875
        by (metis bij bij_betw_iff_bijections lessThan_iff nat_neq_iff that)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   876
      moreover obtain sk sk' where "r' k = cut sk" "r' k' = cut sk'"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   877
        by (metis R_def \<open>k < N'\<close> \<open>k' < N'\<close> bij bij_betwE image_iff lessThan_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   878
      ultimately show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   879
        using local.cut_def by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   880
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   881
    then show "uniq_exponents n N' r'"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   882
      by (auto simp: uniq_exponents_def R_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   883
    have "R \<subseteq> (cut \<circ> r) ` {..<N}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   884
      by (auto simp: R_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   885
    then show "N' \<le> N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   886
      unfolding N'_def by (metis card_lessThan finite_lessThan surj_card_le)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   887
    show "gpoly n x N a r = gpoly n x N' a' r'" for x
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   888
    proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   889
      have "a k * (\<Prod>i<n. x i ^ r k i) 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   890
          = (\<Sum>i<N'. (if r' i = cut (r k) then of_nat (a k) else of_nat 0) * (\<Prod>j<n. x j ^ r' i j))" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   891
        if "k<N" for k
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   892
        using that
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   893
        by (cases"a k = 0")
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   894
           (simp_all add: if_distrib [of "\<lambda>v. v * _"] 1 cut_def flip: sum.inter_filter cong: if_cong)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   895
      then show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   896
        by (simp add: gpoly_def a'_def sum_distrib_right sum.swap [where A="{..<N'}"] if_distrib [of of_nat])
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   897
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   898
    show "nontriv_exponents n N' r'" if ne: "nontriv_exponents n N r"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   899
    proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   900
      have "\<exists>i<n. 0 < r' k' i" if "k' < N'" for k'
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   901
      proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   902
        have "r' k' \<in> R"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   903
          using bij bij_betwE that by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   904
        then obtain k where "k<N" and k: "r' k' = cut (r k)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   905
          using R_def by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   906
        with ne obtain i where "i<n" "r k i > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   907
          by (auto simp: nontriv_exponents_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   908
        then show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   909
          using k local.cut_def by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   910
      qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   911
      then show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   912
        by (simp add: nontriv_exponents_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   913
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   914
    have "0 < a' k'" if "k' < N'" for k'
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   915
    proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   916
      have "r' k' \<in> R"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   917
        using bij bij_betwE that by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   918
      then obtain k where "k<N" "a k > 0" "r' k' = cut (r k)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   919
        using R_def by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   920
      then have False if "a' k' = 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   921
        using that by (force simp add: a'_def Ball_def )
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   922
      then show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   923
        by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   924
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   925
    then show "nonzero_coeffs N' a'"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   926
      by (auto simp: nonzero_coeffs_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   927
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   928
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   929
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   930
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   931
lemma Kronecker_simult_aux3: 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   932
  "\<exists>N a r. (\<forall>x. (1 + (\<Sum>i<n. x i))^p = 1 + gpoly n x N a r) \<and> Suc N \<le> (p+1)^n
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   933
         \<and> nontriv_exponents n N r"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   934
proof (induction n arbitrary: p)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   935
  case 0
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   936
  then show ?case
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   937
    by (auto simp: gpoly_def nontriv_exponents_def nonzero_coeffs_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   938
next
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   939
  case (Suc n)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   940
  then obtain Nf af rf 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   941
    where feq: "\<And>q x. (1 + (\<Sum>i<n. x i)) ^ q = 1 + gpoly n x (Nf q) (af q) (rf q)" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   942
      and Nle: "\<And>q. Suc (Nf q) \<le> (q+1)^n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   943
      and nontriv: "\<And>q. nontriv_exponents n (Nf q) (rf q)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   944
    by metis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   945
  define N where "N \<equiv> Nf p + (\<Sum>q<p. Suc (Nf q))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   946
  define a where "a \<equiv> \<lambda>k. if k < Nf p then af p k
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   947
                           else let q = part (\<lambda>t. Suc (Nf t)) p (k - Nf p)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   948
                                in (p choose q) *
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   949
                                   (if k - Nf p - (\<Sum>t<q. Suc (Nf t)) = Nf q then Suc 0
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   950
                                    else af q (k - Nf p - (\<Sum>t<q. Suc(Nf t))))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   951
  define r where "r \<equiv> \<lambda>k. if k < Nf p then (rf p k)(n := 0)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   952
                                       else let q = part (\<lambda>t. Suc (Nf t)) p (k - Nf p)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   953
                                          in (if k - Nf p - (\<Sum>t<q. Suc (Nf t)) = Nf q then \<lambda>_. 0
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   954
                                              else rf q (k - Nf p - (\<Sum>t<q. Suc(Nf t))))  (n := p-q)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   955
  have peq: "{..p} = insert p {..<p}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   956
    by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   957
  have "nontriv_exponents n (Nf p) (\<lambda>i. (rf p i)(n := 0))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   958
       "\<And>q. q<p \<Longrightarrow> nontriv_exponents (Suc n) (Suc (Nf q)) (\<lambda>k. (if k = Nf q then \<lambda>_. 0 else rf q k) (n := p - q))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   959
    using nontriv by (fastforce simp: nontriv_exponents_def)+
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   960
  then have "nontriv_exponents (Suc n) N r"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   961
    unfolding N_def r_def by (intro nontriv_exponents_add nontriv_exponents_sum)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   962
  moreover
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   963
  { fix x :: "nat \<Rightarrow> complex"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   964
    have "(1 + (\<Sum>i < Suc n. x i)) ^ p = (1 + (\<Sum>i<n. x i) + x n) ^ p"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   965
      by (simp add: add_ac)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   966
    also have "\<dots> = (\<Sum>q\<le>p. (p choose q) * (1 + (\<Sum>i<n. x i))^q * x n^(p-q))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   967
      by (simp add: binomial_ring)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   968
    also have "\<dots> = (\<Sum>q\<le>p. (p choose q) * (1 + gpoly n x (Nf q) (af q) (rf q)) * x n^(p-q))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   969
      by (simp add: feq)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   970
    also have "\<dots> = 1 + (gpoly n x (Nf p) (af p) (rf p) + (\<Sum>q<p. (p choose q) * (1 + gpoly n x (Nf q) (af q) (rf q)) * x n^(p-q)))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   971
      by (simp add: algebra_simps sum.distrib peq)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   972
    also have "\<dots> = 1 + gpoly (Suc n) x N a r"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   973
      apply (subst one_plus_gpoly)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   974
      apply (simp add: const_times_gpoly monom_times_gpoly gpoly_sum)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   975
      apply (simp add: gpoly_inc [where n=n] gpoly_add N_def a_def r_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   976
      done
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   977
    finally have "(1 + sum x {..<Suc n}) ^ p = 1 + gpoly (Suc n) x N a r" . 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   978
  }
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   979
  moreover have "Suc N \<le> (p + 1) ^ Suc n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   980
  proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   981
    have "Suc N = (\<Sum>q\<le>p. Suc (Nf q))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   982
      by (simp add: N_def peq)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   983
    also have "\<dots> \<le> (\<Sum>q\<le>p. (q+1)^n)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   984
      by (meson Nle sum_mono)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   985
    also have "\<dots> \<le> (\<Sum>q\<le>p. (p+1)^n)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   986
      by (force intro!: sum_mono power_mono)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   987
    also have "\<dots> \<le> (p + 1) ^ Suc n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   988
      by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   989
    finally show "Suc N \<le> (p + 1) ^ Suc n" .
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   990
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   991
  ultimately show ?case
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   992
    by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   993
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   994
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   995
lemma Kronecker_simult_aux3_uniq_exponents:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   996
  obtains N a r where "\<And>x. (1 + (\<Sum>i<n. x i))^p = 1 + gpoly n x N a r" "Suc N \<le> (p+1)^n" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   997
                      "nontriv_exponents n N r" "uniq_exponents n N r" "nonzero_coeffs N a"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   998
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   999
  obtain N0 a0 r0 where "\<And>x. (1 + (\<Sum>r<n. x r)) ^ p = 1 + gpoly n x N0 a0 r0" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1000
    and "Suc N0 \<le> (p+1)^n" "nontriv_exponents n N0 r0" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1001
    using Kronecker_simult_aux3 by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1002
  with le_trans Suc_le_mono gpoly_uniq_exponents [of n N0 a0 r0] that show thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1003
    by (metis (no_types, lifting))
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1004
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1005
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1006
subsection \<open>And finally Kroncker's theorem itself\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1007
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1008
text \<open>Statement of Theorem 7.9\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1009
theorem Kronecker_thm_1:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1010
  fixes \<alpha> \<theta>:: "nat \<Rightarrow> real" and n:: nat
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1011
  assumes indp: "module.independent (\<lambda>r. (*) (real_of_int r)) (\<theta> ` {..<n})"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1012
    and inj\<theta>: "inj_on \<theta> {..<n}" and "\<epsilon> > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1013
  obtains t h where "\<And>i. i < n \<Longrightarrow> \<bar>t * \<theta> i - of_int (h i) - \<alpha> i\<bar> < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1014
proof (cases "n>0")
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1015
  case False then show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1016
    using that by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1017
next
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1018
  case True
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1019
  interpret Modules.module "(\<lambda>r. (*) (real_of_int r))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1020
    by (simp add: Modules.module.intro distrib_left mult.commute)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1021
  define F where "F \<equiv> \<lambda>t. 1 + (\<Sum>i<n. exp(\<i> * of_real (2 * pi * (t * \<theta> i - \<alpha> i))))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1022
  define L where "L \<equiv> Sup (range (norm \<circ> F))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1023
  have [continuous_intros]: "0 < T \<Longrightarrow> continuous_on {0..T} F" for T
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1024
    unfolding F_def by (intro continuous_intros)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1025
  have nft_Sucn: "norm (F t) \<le> Suc n" for t
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1026
    unfolding F_def by (rule norm_triangle_le order_trans [OF norm_sum] | simp)+
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1027
  then have L_le: "L \<le> Suc n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1028
    by (simp add: L_def cSUP_least)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1029
  have nft_L: "norm (F t) \<le> L" for t
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1030
    by (metis L_def UNIV_I bdd_aboveI2 cSUP_upper nft_Sucn o_apply)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1031
  have "L = Suc n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1032
  proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1033
    { fix p::nat
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1034
      assume "p>0"      
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1035
      obtain N a r where 3: "\<And>x. (1 + (\<Sum>r<n. x r)) ^ p = 1 + gpoly n x N a r" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1036
             and SucN: "Suc N \<le> (p+1)^n"   
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1037
             and nontriv: "nontriv_exponents n N r" and uniq: "uniq_exponents n N r"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1038
             and apos: "nonzero_coeffs N a"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1039
        using Kronecker_simult_aux3_uniq_exponents by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1040
      have "N \<noteq> 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1041
      proof 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1042
        assume "N = 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1043
        have "2^p = (1::complex)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1044
          using 3 [of "(\<lambda>_. 0)(0:=1)"] True \<open>p>0\<close> \<open>N = 0\<close> by (simp add: gpoly_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1045
        then have "2 ^ p = Suc 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1046
          by (metis of_nat_1 One_nat_def of_nat_eq_iff of_nat_numeral of_nat_power)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1047
        with \<open>0 < p\<close> show False by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1048
      qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1049
      define x where "x \<equiv> \<lambda>t r. exp(\<i> * of_real (2 * pi * (t * \<theta> r - \<alpha> r)))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1050
      define f where "f \<equiv> \<lambda>t. (F t) ^ p"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1051
      have feq: "f t = 1 + gpoly n (x t) N a r" for t
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1052
        unfolding f_def F_def x_def by (simp flip: 3)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1053
      define c where "c \<equiv> \<lambda>k. a k / cis (\<Sum>i<n. (pi * (2 * (\<alpha> i * real (r k i)))))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1054
      define \<eta> where "\<eta> \<equiv> \<lambda>k. 2 * pi * (\<Sum>i<n. r k i * \<theta> i)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1055
      define INTT where "INTT \<equiv> \<lambda>k T. (1/T) * integral {0..T} (\<lambda>t. f t * exp(-\<i> * of_real t * \<eta> k))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1056
      have "a k * (\<Prod>i<n. x t i ^ r k i) = c k * exp (\<i> * t * \<eta> k)" if "k<N" for k t
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1057
        apply (simp add: x_def \<eta>_def sum_distrib_left flip: exp_of_nat_mult exp_sum)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1058
        apply (simp add: algebra_simps sum_subtractf exp_diff c_def sum_distrib_left cis_conv_exp)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1059
        done
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1060
      then have fdef: "f t = 1 + (\<Sum>k<N. c k * exp(\<i> * of_real t * \<eta> k))" for t
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1061
        by (simp add: feq gpoly_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1062
      have nzero: "\<theta> i \<noteq> 0" if "i<n" for i
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1063
        using indp that local.dependent_zero by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1064
      have ind_disj: "\<And>u. (\<forall>x<n. u (\<theta> x) = 0) \<or> (\<Sum>v \<in> \<theta>`{..<n}. of_int (u v) * v) \<noteq> 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1065
        using indp by (auto simp: dependent_finite)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1066
      have inj\<eta>: "inj_on \<eta> {..<N}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1067
      proof
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1068
        fix k k'
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1069
        assume k: "k \<in> {..<N}" "k' \<in> {..<N}" and "\<eta> k = \<eta> k'"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1070
        then have eq: "(\<Sum>i<n. real (r k i) * \<theta> i) = (\<Sum>i<n. real (r k' i) * \<theta> i)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1071
          by (auto simp: \<eta>_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1072
        define f where "f \<equiv> \<lambda>z. let i = inv_into {..<n} \<theta> z in int (r k i) - int (r k' i)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1073
        show "k = k'"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1074
          using ind_disj [of f] inj\<theta> uniq eq k
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1075
          apply (simp add: f_def Let_def sum.reindex sum_subtractf algebra_simps uniq_exponents_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1076
          by (metis not_less_iff_gr_or_eq)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1077
      qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1078
      moreover have "0 \<notin> \<eta> ` {..<N}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1079
        unfolding \<eta>_def
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1080
      proof clarsimp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1081
        fix k
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1082
        assume *: "(\<Sum>i<n. real (r k i) * \<theta> i) = 0" "k < N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1083
        define f where "f \<equiv> \<lambda>z. let i = inv_into {..<n} \<theta> z in int (r k i)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1084
        obtain i where "i<n" and "r k i > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1085
          by (meson \<open>k < N\<close> nontriv nontriv_exponents_def zero_less_iff_neq_zero)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1086
        with * nzero show False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1087
          using ind_disj [of f] inj\<theta> by (simp add: f_def sum.reindex)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1088
      qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1089
      ultimately have 15: "(INTT k \<longlongrightarrow> c k) at_top" if "k<N" for k
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1090
        unfolding fdef INTT_def using Kronecker_simult_aux1_strict that by presburger
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1091
      have norm_c: "norm (c k) \<le> L^p" if "k<N" for k 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1092
      proof (intro tendsto_le [of _ "\<lambda>_. L^p"])
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1093
        show "((norm \<circ> INTT k) \<longlongrightarrow> cmod (c k)) at_top"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1094
          using that 15 by (simp add: o_def tendsto_norm)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1095
        have "norm (INTT k T) \<le> L^p" if  "T \<ge> 0" for T::real
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1096
        proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1097
          have "0 \<le> L ^ p"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1098
            by (meson nft_L norm_ge_zero order_trans zero_le_power) 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1099
          have "norm (integral {0..T} (\<lambda>t. f t * exp (- (\<i> *  t * \<eta> k)))) 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1100
                \<le> integral {0..T} (\<lambda>t. L^p)" (is "?L \<le> ?R")  if "T>0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1101
          proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1102
            have "?L \<le> integral {0..T} (\<lambda>t. norm (f t * exp (- (\<i> *  t * \<eta> k))))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1103
              unfolding f_def by (intro continuous_on_imp_absolutely_integrable_on continuous_intros that)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1104
            also have "\<dots> \<le> ?R"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1105
              unfolding f_def
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1106
              by (intro integral_le continuous_intros integrable_continuous_interval that
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1107
                  | simp add: nft_L norm_mult norm_power power_mono)+
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1108
            finally show ?thesis .
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1109
          qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1110
          with \<open>T \<ge> 0\<close> have "norm (INTT k T) \<le> (1/T) * integral {0..T} (\<lambda>t. L ^ p)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1111
            by (auto simp add: INTT_def norm_divide divide_simps simp del: integral_const_real)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1112
          also have "\<dots> \<le> L ^ p"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1113
            using \<open>T \<ge> 0\<close> \<open>0 \<le> L ^ p\<close> by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1114
          finally show ?thesis .
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1115
        qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1116
        then show "\<forall>\<^sub>F x in at_top. (norm \<circ> INTT k) x \<le> L ^ p"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1117
          using eventually_at_top_linorder that by fastforce
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1118
      qed auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1119
      then have "(\<Sum>k<N. cmod (c k)) \<le> N * L^p"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1120
        by (metis sum_bounded_above card_lessThan lessThan_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1121
      moreover
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1122
      have "Re((1 + (\<Sum>r<n. 1)) ^ p) = Re (1 + gpoly n (\<lambda>_. 1) N a r)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1123
        using 3 [of "\<lambda>_. 1"] by metis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1124
      then have 14: "1 + (\<Sum>k<N. norm (c k)) = (1 + real n) ^ p"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1125
        by (simp add: c_def norm_divide gpoly_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1126
      moreover 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1127
      have "L^p \<ge> 1"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1128
        using norm_c [of 0] \<open>N \<noteq> 0\<close> apos 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1129
        by (force simp add: c_def norm_divide nonzero_coeffs_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1130
      ultimately have *: "(1 + real n) ^ p \<le> Suc N * L^p"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1131
        by (simp add: algebra_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1132
      have [simp]: "L>0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1133
        using \<open>1 \<le> L ^ p\<close> \<open>0 < p\<close> by (smt (verit, best) nft_L norm_ge_zero power_eq_0_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1134
      have "Suc n ^ p \<le> (p+1)^n * L^p" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1135
        by (smt (verit, best) * mult.commute \<open>1 \<le> L ^ p\<close> SucN mult_left_mono of_nat_1 of_nat_add of_nat_power_eq_of_nat_cancel_iff of_nat_power_le_of_nat_cancel_iff plus_1_eq_Suc)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1136
      then have "(Suc n ^ p) powr (1/p) \<le> ((p+1)^n * L^p) powr (1/p)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1137
        by (simp add: powr_mono2)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1138
      then have "(Suc n) \<le> ((p+1)^n) powr (1/p) * L"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1139
        using \<open>p > 0\<close> \<open>0 < L\<close> by (simp add: powr_powr powr_mult flip: powr_realpow)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1140
      also have "\<dots> = ((p+1) powr n) powr (1/p) * L"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1141
        by (simp add: powr_realpow)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1142
      also have "\<dots> = (p+1) powr (n/p) * L"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1143
        by (simp add: powr_powr)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1144
      finally have "(n + 1) / L \<le> (p+1) powr (n/p)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1145
        by (simp add: divide_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1146
      then have "ln ((n + 1) / L) \<le> ln (real (p + 1) powr (real n / real p))"
80521
5c691b178e08 Totalisation of ln and therefore log and powr
paulson <lp15@cam.ac.uk>
parents: 80175
diff changeset
  1147
        by (simp add: flip: ln_powr)
78890
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1148
      also have "\<dots> \<le> (n/p) * ln(p+1)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1149
        by (simp add: powr_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1150
      finally have "ln ((n + 1) / L) \<le> (n/p) * ln(p+1) \<and> L > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1151
        by fastforce
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1152
    } note * = this
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1153
    then have [simp]: "L > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1154
      by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1155
    have 0: "(\<lambda>p. (n/p) * ln(p+1)) \<longlonglongrightarrow> 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1156
      by real_asymp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1157
    have "ln (real (n + 1) / L) \<le> 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1158
      using * eventually_at_top_dense by (intro tendsto_lowerbound [OF 0]) auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1159
    then have "n+1 \<le> L"
80528
6dec6b1f31f5 Better multiplication and division rules for ln and log
paulson <lp15@cam.ac.uk>
parents: 80521
diff changeset
  1160
      using \<open>0 < L\<close> by (simp add: ln_div)
78890
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1161
    then show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1162
      using L_le by linarith
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1163
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1164
  with Kronecker_simult_aux2 [of n \<theta> \<alpha>] \<open>\<epsilon> > 0\<close> that show thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1165
    by (auto simp: F_def L_def add.commute diff_diff_eq)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1166
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1167
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1168
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1169
text \<open>Theorem 7.10\<close>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1170
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1171
corollary Kronecker_thm_2:
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1172
  fixes \<alpha> \<theta> :: "nat \<Rightarrow> real" and n :: nat
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1173
  assumes indp: "module.independent (\<lambda>r x. of_int r * x) (\<theta> ` {..n})"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1174
    and inj\<theta>: "inj_on \<theta> {..n}" and [simp]: "\<theta> n = 1" and "\<epsilon> > 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1175
  obtains k m where "\<And>i. i < n \<Longrightarrow> \<bar>of_int k * \<theta> i - of_int (m i) - \<alpha> i\<bar> < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1176
proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1177
  interpret Modules.module "(\<lambda>r. (*) (real_of_int r))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1178
    by (simp add: Modules.module.intro distrib_left mult.commute)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1179
  have one_in_\<theta>: "1 \<in> \<theta> ` {..n}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1180
    unfolding \<open>\<theta> n = 1\<close>[symmetric] by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1181
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1182
  have not_in_Ints: "\<theta> i \<notin> \<int>" if i: "i < n" for i
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1183
  proof
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1184
    assume "\<theta> i \<in> \<int>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1185
    then obtain m where m: "\<theta> i = of_int m"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1186
      by (auto elim!: Ints_cases)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1187
    have not_one: "\<theta> i \<noteq> 1"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1188
      using inj_onD[OF inj\<theta>, of i n] i by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1189
    define u :: "real \<Rightarrow> int" where "u = (\<lambda>_. 0)(\<theta> i := 1, 1 := -m)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1190
    show False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1191
      using independentD[OF indp, of "\<theta> ` {i, n}" u "\<theta> i"] \<open>i < n\<close> not_one one_in_\<theta>
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1192
      by (auto simp: u_def simp flip: m)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1193
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1194
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1195
  have inj\<theta>': "inj_on (frac \<circ> \<theta>) {..n}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1196
  proof (rule linorder_inj_onI')
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1197
    fix i j assume ij: "i \<in> {..n}" "j \<in> {..n}" "i < j"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1198
    show "(frac \<circ> \<theta>) i \<noteq> (frac \<circ> \<theta>) j"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1199
    proof (cases "j = n")
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1200
      case True
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1201
      thus ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1202
        using not_in_Ints[of i] ij by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1203
    next
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1204
      case False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1205
      hence "j < n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1206
        using ij by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1207
      have "inj_on \<theta> (set [i, j, n])"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1208
        using inj\<theta> by (rule inj_on_subset) (use ij in auto)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1209
      moreover have "distinct [i, j, n]"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1210
        using \<open>j < n\<close> ij by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1211
      ultimately have "distinct (map \<theta> [i, j, n])"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1212
        unfolding distinct_map by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1213
      hence distinct: "distinct [\<theta> i, \<theta> j, 1]"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1214
        by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1215
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1216
      show "(frac \<circ> \<theta>) i \<noteq> (frac \<circ> \<theta>) j"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1217
      proof
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1218
        assume eq: "(frac \<circ> \<theta>) i = (frac \<circ> \<theta>) j"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1219
        define u :: "real \<Rightarrow> int" where "u = (\<lambda>_. 0)(\<theta> i := 1, \<theta> j := -1, 1 := \<lfloor>\<theta> j\<rfloor> - \<lfloor>\<theta> i\<rfloor>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1220
        have "(\<Sum>v\<in>{\<theta> i, \<theta> j, 1}. real_of_int (u v) * v) = frac (\<theta> i) - frac (\<theta> j)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1221
          using distinct by (simp add: u_def frac_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1222
        also have "\<dots> = 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1223
          using eq by simp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1224
        finally have eq0: "(\<Sum>v\<in>{\<theta> i, \<theta> j, 1}. real_of_int (u v) * v) = 0" .
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1225
        show False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1226
          using independentD[OF indp _ _ eq0, of "\<theta> i"] one_in_\<theta> ij distinct
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1227
          by (auto simp: u_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1228
      qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1229
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1230
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1231
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1232
  have "frac (\<theta> n) = 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1233
    by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1234
  then have \<theta>no_int: "of_int r \<notin> \<theta> ` {..<n}" for r
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1235
    using inj\<theta>' frac_of_int  
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1236
    apply (simp add: inj_on_def Ball_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1237
    by (metis \<open>frac (\<theta> n) = 0\<close> frac_of_int imageE le_less lessThan_iff less_irrefl)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1238
  define \<theta>' where "\<theta>' \<equiv> (frac \<circ> \<theta>)(n:=1)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1239
  have [simp]: "{..<Suc n} \<inter> {x. x \<noteq> n} = {..<n}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1240
    by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1241
  have \<theta>image[simp]: "\<theta> ` {..n} = insert 1 (\<theta> ` {..<n})"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1242
    using lessThan_Suc lessThan_Suc_atMost by force
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1243
  have "module.independent (\<lambda>r. (*) (of_int r)) (\<theta>' ` {..<Suc n})"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1244
    unfolding dependent_explicit \<theta>'_def
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1245
  proof clarsimp
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1246
    fix T u v
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1247
    assume T: "T \<subseteq> insert 1 ((\<lambda>i. frac (\<theta> i)) ` {..<n})"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1248
      and "finite T"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1249
      and uv_eq0: "(\<Sum>v\<in>T. of_int (u v) * v) = 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1250
      and "v \<in> T"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1251
    define invf where "invf \<equiv> inv_into {..<n} (frac \<circ> \<theta>)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1252
    have "inj_on (\<lambda>x. frac (\<theta> x)) {..<n}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1253
      using inj\<theta>' by (auto simp: inj_on_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1254
    then have invf [simp]: "invf (frac (\<theta> i)) = i" if "i<n" for i
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1255
      using frac_lt_1 [of "\<theta> i"] that by (auto simp: invf_def o_def inv_into_f_eq [where x=i])
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1256
    define N where "N \<equiv> invf ` (T - {1})"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1257
    have Nsub: "N \<subseteq> {..n}" and "finite N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1258
      using T \<open>finite T\<close> by (auto simp: N_def subset_iff)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1259
    have inj_invf: "inj_on invf (T - {1})"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1260
      using \<theta>no_int [of 1] \<open>\<theta> n = 1\<close> inv_into_injective T
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1261
      by (fastforce simp: inj_on_def invf_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1262
    have invf_iff: "invf t = i \<longleftrightarrow> (i<n \<and> t = frac (\<theta> i))" if "t \<in> T-{1}" for i t
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1263
      using that T by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1264
    have sumN: "(\<Sum>i\<in>N. f i) = (\<Sum>x\<in>T - {1}. f (invf x))" for f :: "nat \<Rightarrow> int"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1265
      using inj_invf T  by (simp add: N_def sum.reindex)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1266
    define T' where "T' \<equiv> insert 1 (\<theta> ` N)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1267
    have [simp]: "finite T'" "1 \<in> T'"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1268
      using T'_def N_def \<open>finite T\<close> by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1269
    have T'sub: "T' \<subseteq> \<theta> ` {..n}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1270
      using Nsub T'_def \<theta>image by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1271
    have in_N_not1: "x \<in> N \<Longrightarrow> \<theta> x \<noteq> 1" for x
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1272
      using \<theta>no_int [of 1] by (metis N_def image_iff invf_iff lessThan_iff of_int_1)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1273
    define u' where "u' = (u \<circ> frac)(1:=(if 1\<in>T then u 1 else 0) + (\<Sum>i\<in>N. - \<lfloor>\<theta> i\<rfloor> * u (frac (\<theta> i))))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1274
    have "(\<Sum>v\<in>T'. real_of_int (u' v) * v) = u' 1 + (\<Sum>v \<in> \<theta> ` N. real_of_int (u' v) * v)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1275
      using \<open>finite N\<close> by (simp add: T'_def image_iff in_N_not1)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1276
    also have "\<dots> = u' 1 + sum ((\<lambda>v. real_of_int (u' v) * v) \<circ> \<theta>) N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1277
      by (smt (verit) N_def \<open>finite N\<close> image_iff invf_iff sum.reindex_nontrivial)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1278
    also have "\<dots> = u' 1 + (\<Sum>i\<in>N. of_int ((u \<circ> frac) (\<theta> i)) * \<theta> i)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1279
      by (auto simp add: u'_def in_N_not1)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1280
    also have "\<dots> = u' 1 + (\<Sum>i\<in>N. of_int ((u \<circ> frac) (\<theta> i)) * (floor (\<theta> i) + frac(\<theta> i)))"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1281
      by (simp add: frac_def cong: if_cong)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1282
    also have "\<dots> = (\<Sum>v\<in>T. of_int (u v) * v)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1283
    proof (cases "1 \<in> T")
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1284
      case True
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1285
      then have T1: "(\<Sum>v\<in>T. real_of_int (u v) * v) = u 1 + (\<Sum>v\<in>T-{1}. real_of_int (u v) * v)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1286
        by (simp add: \<open>finite T\<close> sum.remove)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1287
      show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1288
        using inj_invf True T unfolding N_def u'_def
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1289
        by (auto simp: add.assoc distrib_left sum.reindex T1 simp flip: sum.distrib intro!: sum.cong)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1290
    next
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1291
      case False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1292
      then show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1293
        using inj_invf T unfolding N_def u'_def
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1294
        by (auto simp: algebra_simps sum.reindex simp flip: sum.distrib intro!: sum.cong)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1295
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1296
    also have "\<dots> = 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1297
      using uv_eq0 by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1298
    finally have 0: "(\<Sum>v\<in>T'. real_of_int (u' v) * v) = 0" .
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1299
    have "u v = 0" if T'0: "\<And>v. v\<in>T' \<Longrightarrow> u' v = 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1300
    proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1301
      have [simp]: "u t = 0" if "t \<in> T - {1}" for t
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1302
      proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1303
        have "\<theta> (invf t) \<in> T'"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1304
          using N_def T'_def that by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1305
        then show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1306
          using that T'0 [of "\<theta> (invf t)"]
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1307
          by (smt (verit, best) in_N_not1 N_def fun_upd_other imageI invf_iff o_apply u'_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1308
      qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1309
      show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1310
      proof (cases "v = 1")
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1311
        case True
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1312
        then have "1 \<in> T"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1313
          using \<open>v \<in> T\<close> by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1314
        have "(\<Sum>v\<in>T. real_of_int (u v) * v) = u 1 + (\<Sum>v\<in>T - {1}. real_of_int (u v) * v)"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1315
          using True \<open>finite T\<close> \<open>v \<in> T\<close> mk_disjoint_insert by fastforce
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1316
        then have "0 = u 1"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1317
          using uv_eq0 by auto
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1318
        with True show ?thesis by presburger
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1319
      next
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1320
        case False
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1321
        then have "\<theta> (invf v) \<in> \<theta> ` N"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1322
          using N_def \<open>v \<in> T\<close> by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1323
        then show ?thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1324
          using that [of "\<theta> (invf v)"] False \<open>v \<in> T\<close> T by (force simp: T'_def in_N_not1 u'_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1325
      qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1326
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1327
    with indp T'sub \<open>finite T'\<close> 0 show "u v = 0"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1328
      unfolding dependent_explicit by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1329
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1330
  moreover have "inj_on \<theta>' {..<Suc n}"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1331
    using inj\<theta>' 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1332
    unfolding \<theta>'_def inj_on_def 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1333
    by (metis comp_def frac_lt_1 fun_upd_other fun_upd_same lessThan_Suc_atMost less_irrefl)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1334
  ultimately obtain t h where th: "\<And>i. i < Suc n \<Longrightarrow> \<bar>t * \<theta>' i - of_int (h i) - (\<alpha>(n:=0)) i\<bar> < \<epsilon>/2"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1335
    using Kronecker_thm_1 [of \<theta>' "Suc n" "\<epsilon>/2"] lessThan_Suc_atMost assms using half_gt_zero by blast
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1336
  define k where "k = h n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1337
  define m where "m \<equiv> \<lambda>i. h i + k * \<lfloor>\<theta> i\<rfloor>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1338
  show thesis
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1339
  proof
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1340
    fix i assume "i < n"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1341
    have "\<bar>k * frac (\<theta> i) - h i - \<alpha> i\<bar> < \<epsilon>" 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1342
    proof -
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1343
      have "\<bar>k * frac (\<theta> i) - h i - \<alpha> i\<bar> = \<bar>t * frac (\<theta> i) - h i - \<alpha> i + (k-t) * frac (\<theta> i)\<bar>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1344
        by (simp add: algebra_simps)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1345
      also have "\<dots> \<le> \<bar>t * frac (\<theta> i) - h i - \<alpha> i\<bar> + \<bar>(k-t) * frac (\<theta> i)\<bar>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1346
        by linarith
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1347
      also have "\<dots> \<le> \<bar>t * frac (\<theta> i) - h i - \<alpha> i\<bar> + \<bar>k-t\<bar>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1348
        using frac_lt_1 [of "\<theta> i"] le_less by (fastforce simp add: abs_mult)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1349
      also have "\<dots> < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1350
        using th[of i] th[of n] \<open>i<n\<close> 
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1351
        by (simp add: k_def \<theta>'_def) (smt (verit, best))
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1352
      finally show ?thesis .
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1353
    qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1354
    then show "\<bar>k * \<theta> i - m i - \<alpha> i\<bar> < \<epsilon>"
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1355
      by (simp add: algebra_simps frac_def m_def)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1356
  qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1357
qed
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1358
(* TODO: use something like module.independent_family instead *)
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1359
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1360
d8045bc0544e Added Kronecker's approximation theorem. Requires adding Real_Asymp to HOL-Analysis. Funny syntax issue in Probability/Projective_Family
paulson <lp15@cam.ac.uk>
parents:
diff changeset
  1361
end