src/HOL/Library/Quadratic_Discriminant.thy
author nipkow
Wed, 13 Feb 2019 07:48:42 +0100
changeset 69801 a99a0f5474c5
parent 68553 333998becebe
permissions -rw-r--r--
too agressive
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62058
1cfd5d604937 updated headers;
wenzelm
parents: 60500
diff changeset
     1
(*  Title:       HOL/Library/Quadratic_Discriminant.thy
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     2
    Author:      Tim Makarios <tjm1983 at gmail.com>, 2012
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     3
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     4
Originally from the AFP entry Tarskis_Geometry
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     5
*)
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     6
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     7
section "Roots of real quadratics"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     8
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     9
theory Quadratic_Discriminant
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    10
imports Complex_Main
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    11
begin
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    12
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    13
definition discrim :: "real \<Rightarrow> real \<Rightarrow> real \<Rightarrow> real"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    14
  where "discrim a b c \<equiv> b\<^sup>2 - 4 * a * c"
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    15
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    16
lemma complete_square:
68553
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
    17
  "a \<noteq> 0 \<Longrightarrow> a * x\<^sup>2 + b * x + c = 0 \<longleftrightarrow> (2 * a * x + b)\<^sup>2 = discrim a b c"
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
    18
by (simp add: discrim_def) algebra
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    19
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    20
lemma discriminant_negative:
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    21
  fixes a b c x :: real
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    22
  assumes "a \<noteq> 0"
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    23
    and "discrim a b c < 0"
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    24
  shows "a * x\<^sup>2 + b * x + c \<noteq> 0"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    25
proof -
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    26
  have "(2 * a * x + b)\<^sup>2 \<ge> 0"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    27
    by simp
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    28
  with \<open>discrim a b c < 0\<close> have "(2 * a * x + b)\<^sup>2 \<noteq> discrim a b c"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    29
    by arith
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    30
  with complete_square and \<open>a \<noteq> 0\<close> show "a * x\<^sup>2 + b * x + c \<noteq> 0"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    31
    by simp
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    32
qed
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    33
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    34
lemma plus_or_minus_sqrt:
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    35
  fixes x y :: real
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    36
  assumes "y \<ge> 0"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    37
  shows "x\<^sup>2 = y \<longleftrightarrow> x = sqrt y \<or> x = - sqrt y"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    38
proof
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    39
  assume "x\<^sup>2 = y"
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    40
  then have "sqrt (x\<^sup>2) = sqrt y"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    41
    by simp
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    42
  then have "sqrt y = \<bar>x\<bar>"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    43
    by simp
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    44
  then show "x = sqrt y \<or> x = - sqrt y"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    45
    by auto
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    46
next
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    47
  assume "x = sqrt y \<or> x = - sqrt y"
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    48
  then have "x\<^sup>2 = (sqrt y)\<^sup>2 \<or> x\<^sup>2 = (- sqrt y)\<^sup>2"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    49
    by auto
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    50
  with \<open>y \<ge> 0\<close> show "x\<^sup>2 = y"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    51
    by simp
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    52
qed
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    53
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    54
lemma divide_non_zero:
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    55
  fixes x y z :: real
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    56
  assumes "x \<noteq> 0"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    57
  shows "x * y = z \<longleftrightarrow> y = z / x"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    58
proof
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    59
  show "y = z / x" if "x * y = z"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    60
    using \<open>x \<noteq> 0\<close> that by (simp add: field_simps)
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    61
  show "x * y = z" if "y = z / x"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    62
    using \<open>x \<noteq> 0\<close> that by simp
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    63
qed
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    64
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    65
lemma discriminant_nonneg:
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    66
  fixes a b c x :: real
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    67
  assumes "a \<noteq> 0"
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    68
    and "discrim a b c \<ge> 0"
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    69
  shows "a * x\<^sup>2 + b * x + c = 0 \<longleftrightarrow>
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    70
    x = (-b + sqrt (discrim a b c)) / (2 * a) \<or>
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    71
    x = (-b - sqrt (discrim a b c)) / (2 * a)"
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    72
proof -
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    73
  from complete_square and plus_or_minus_sqrt and assms
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    74
  have "a * x\<^sup>2 + b * x + c = 0 \<longleftrightarrow>
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    75
    (2 * a) * x + b = sqrt (discrim a b c) \<or>
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    76
    (2 * a) * x + b = - sqrt (discrim a b c)"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    77
    by simp
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    78
  also have "\<dots> \<longleftrightarrow> (2 * a) * x = (-b + sqrt (discrim a b c)) \<or>
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    79
    (2 * a) * x = (-b - sqrt (discrim a b c))"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    80
    by auto
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 60162
diff changeset
    81
  also from \<open>a \<noteq> 0\<close> and divide_non_zero [of "2 * a" x]
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    82
  have "\<dots> \<longleftrightarrow> x = (-b + sqrt (discrim a b c)) / (2 * a) \<or>
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    83
    x = (-b - sqrt (discrim a b c)) / (2 * a)"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    84
    by simp
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    85
  finally show "a * x\<^sup>2 + b * x + c = 0 \<longleftrightarrow>
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    86
    x = (-b + sqrt (discrim a b c)) / (2 * a) \<or>
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    87
    x = (-b - sqrt (discrim a b c)) / (2 * a)" .
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    88
qed
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    89
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    90
lemma discriminant_zero:
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    91
  fixes a b c x :: real
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    92
  assumes "a \<noteq> 0"
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    93
    and "discrim a b c = 0"
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    94
  shows "a * x\<^sup>2 + b * x + c = 0 \<longleftrightarrow> x = -b / (2 * a)"
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
    95
  by (simp add: discriminant_nonneg assms)
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    96
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    97
theorem discriminant_iff:
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    98
  fixes a b c x :: real
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    99
  assumes "a \<noteq> 0"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   100
  shows "a * x\<^sup>2 + b * x + c = 0 \<longleftrightarrow>
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   101
    discrim a b c \<ge> 0 \<and>
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   102
    (x = (-b + sqrt (discrim a b c)) / (2 * a) \<or>
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   103
     x = (-b - sqrt (discrim a b c)) / (2 * a))"
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   104
proof
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   105
  assume "a * x\<^sup>2 + b * x + c = 0"
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   106
  with discriminant_negative and \<open>a \<noteq> 0\<close> have "\<not>(discrim a b c < 0)"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   107
    by auto
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   108
  then have "discrim a b c \<ge> 0"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   109
    by simp
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 60162
diff changeset
   110
  with discriminant_nonneg and \<open>a * x\<^sup>2 + b * x + c = 0\<close> and \<open>a \<noteq> 0\<close>
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   111
  have "x = (-b + sqrt (discrim a b c)) / (2 * a) \<or>
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   112
      x = (-b - sqrt (discrim a b c)) / (2 * a)"
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   113
    by simp
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 60162
diff changeset
   114
  with \<open>discrim a b c \<ge> 0\<close>
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   115
  show "discrim a b c \<ge> 0 \<and>
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   116
    (x = (-b + sqrt (discrim a b c)) / (2 * a) \<or>
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   117
     x = (-b - sqrt (discrim a b c)) / (2 * a))" ..
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   118
next
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   119
  assume "discrim a b c \<ge> 0 \<and>
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   120
    (x = (-b + sqrt (discrim a b c)) / (2 * a) \<or>
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   121
     x = (-b - sqrt (discrim a b c)) / (2 * a))"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   122
  then have "discrim a b c \<ge> 0" and
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   123
    "x = (-b + sqrt (discrim a b c)) / (2 * a) \<or>
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   124
     x = (-b - sqrt (discrim a b c)) / (2 * a)"
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   125
    by simp_all
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   126
  with discriminant_nonneg and \<open>a \<noteq> 0\<close> show "a * x\<^sup>2 + b * x + c = 0"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   127
    by simp
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   128
qed
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   129
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   130
lemma discriminant_nonneg_ex:
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   131
  fixes a b c :: real
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   132
  assumes "a \<noteq> 0"
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   133
    and "discrim a b c \<ge> 0"
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   134
  shows "\<exists> x. a * x\<^sup>2 + b * x + c = 0"
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   135
  by (auto simp: discriminant_nonneg assms)
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   136
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   137
lemma discriminant_pos_ex:
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   138
  fixes a b c :: real
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   139
  assumes "a \<noteq> 0"
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   140
    and "discrim a b c > 0"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   141
  shows "\<exists>x y. x \<noteq> y \<and> a * x\<^sup>2 + b * x + c = 0 \<and> a * y\<^sup>2 + b * y + c = 0"
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   142
proof -
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   143
  let ?x = "(-b + sqrt (discrim a b c)) / (2 * a)"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   144
  let ?y = "(-b - sqrt (discrim a b c)) / (2 * a)"
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   145
  from \<open>discrim a b c > 0\<close> have "sqrt (discrim a b c) \<noteq> 0"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   146
    by simp
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   147
  then have "sqrt (discrim a b c) \<noteq> - sqrt (discrim a b c)"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   148
    by arith
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   149
  with \<open>a \<noteq> 0\<close> have "?x \<noteq> ?y"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   150
    by simp
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   151
  moreover from assms have "a * ?x\<^sup>2 + b * ?x + c = 0" and "a * ?y\<^sup>2 + b * ?y + c = 0"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   152
    using discriminant_nonneg [of a b c ?x]
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   153
      and discriminant_nonneg [of a b c ?y]
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   154
    by simp_all
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   155
  ultimately show ?thesis
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   156
    by blast
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   157
qed
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   158
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   159
lemma discriminant_pos_distinct:
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   160
  fixes a b c x :: real
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   161
  assumes "a \<noteq> 0"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   162
    and "discrim a b c > 0"
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   163
  shows "\<exists> y. x \<noteq> y \<and> a * y\<^sup>2 + b * y + c = 0"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   164
proof -
60500
903bb1495239 isabelle update_cartouches;
wenzelm
parents: 60162
diff changeset
   165
  from discriminant_pos_ex and \<open>a \<noteq> 0\<close> and \<open>discrim a b c > 0\<close>
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   166
  obtain w and z where "w \<noteq> z"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   167
    and "a * w\<^sup>2 + b * w + c = 0" and "a * z\<^sup>2 + b * z + c = 0"
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   168
    by blast
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   169
  show "\<exists>y. x \<noteq> y \<and> a * y\<^sup>2 + b * y + c = 0"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   170
  proof (cases "x = w")
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   171
    case True
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   172
    with \<open>w \<noteq> z\<close> have "x \<noteq> z"
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   173
      by simp
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   174
    with \<open>a * z\<^sup>2 + b * z + c = 0\<close> show ?thesis
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   175
      by auto
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   176
  next
63465
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   177
    case False
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   178
    with \<open>a * w\<^sup>2 + b * w + c = 0\<close> show ?thesis
d7610beb98bc misc tuning and modernization;
wenzelm
parents: 62058
diff changeset
   179
      by auto
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   180
  qed
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   181
qed
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   182
68553
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   183
lemma Rats_solution_QE:
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   184
  assumes "a \<in> \<rat>" "b \<in> \<rat>" "a \<noteq> 0"
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   185
  and "a*x^2 + b*x + c = 0"
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   186
  and "sqrt (discrim a b c) \<in> \<rat>"
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   187
  shows "x \<in> \<rat>" 
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   188
using assms(1,2,5) discriminant_iff[THEN iffD1, OF assms(3,4)] by auto
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   189
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   190
lemma Rats_solution_QE_converse:
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   191
  assumes "a \<in> \<rat>" "b \<in> \<rat>"
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   192
  and "a*x^2 + b*x + c = 0"
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   193
  and "x \<in> \<rat>"
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   194
  shows "sqrt (discrim a b c) \<in> \<rat>"
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   195
proof -
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   196
  from assms(3) have "discrim a b c = (2*a*x+b)^2" unfolding discrim_def by algebra
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   197
  hence "sqrt (discrim a b c) = \<bar>2*a*x+b\<bar>" by (simp)
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   198
  thus ?thesis using \<open>a \<in> \<rat>\<close> \<open>b \<in> \<rat>\<close> \<open>x \<in> \<rat>\<close> by (simp)
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   199
qed
333998becebe added lemmas
nipkow
parents: 63465
diff changeset
   200
60162
645058aa9d6f tidying some messy proofs
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   201
end