src/HOL/Hyperreal/Poly.thy
author paulson
Fri, 19 Dec 2003 10:38:39 +0100
changeset 14303 995212a00a50
parent 12224 02df7cbe7d25
child 14435 9e22eeccf129
permissions -rw-r--r--
type hypreal is an ordered field
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12224
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     1
(*  Title:       Poly.thy
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     2
    Author:      Jacques D. Fleuriot
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     3
    Copyright:   2000 University of Edinburgh
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     4
    Description: Properties of univariate real polynomials (cf. Harrison)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     5
*)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     6
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     7
Poly = Transcendental + 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     8
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
     9
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    10
(* Application of polynomial as a real function.                             *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    11
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    12
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    13
consts poly :: real list => real => real
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    14
primrec
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    15
  poly_Nil  "poly [] x = 0"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    16
  poly_Cons "poly (h#t) x = h + x * poly t x"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    17
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    18
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    19
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    20
(* Arithmetic operations on polynomials.                                     *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    21
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    22
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    23
(* addition *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    24
consts "+++" :: [real list, real list] => real list  (infixl 65)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    25
primrec
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    26
  padd_Nil  "[] +++ l2 = l2"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    27
  padd_Cons "(h#t) +++ l2 = (if l2 = [] then h#t 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    28
                            else (h + hd l2)#(t +++ tl l2))"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    29
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    30
(* Multiplication by a constant *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    31
consts "%*" :: [real, real list] => real list  (infixl 70)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    32
primrec
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    33
   cmult_Nil  "c %* [] = []"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    34
   cmult_Cons "c %* (h#t) = (c * h)#(c %* t)"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    35
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    36
(* Multiplication by a polynomial *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    37
consts "***" :: [real list, real list] => real list  (infixl 70)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    38
primrec
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    39
   pmult_Nil  "[] *** l2 = []"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    40
   pmult_Cons "(h#t) *** l2 = (if t = [] then h %* l2 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    41
                              else (h %* l2) +++ ((0) # (t *** l2)))"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    42
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    43
(* Repeated multiplication by a polynomial *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    44
consts mulexp :: [nat, real list, real list] => real list
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    45
primrec
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    46
   mulexp_zero "mulexp 0 p q = q"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    47
   mulexp_Suc  "mulexp (Suc n) p q = p *** mulexp n p q"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    48
  
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    49
  
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    50
(* Exponential *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    51
consts "%^" :: [real list, nat] => real list  (infixl 80)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    52
primrec
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    53
   pexp_0   "p %^ 0 = [1]"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    54
   pexp_Suc "p %^ (Suc n) = p *** (p %^ n)"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    55
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    56
(* Quotient related value of dividing a polynomial by x + a *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    57
(* Useful for divisor properties in inductive proofs *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    58
consts "pquot" :: [real list, real] => real list
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    59
primrec
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    60
   pquot_Nil  "pquot [] a= []"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    61
   pquot_Cons "pquot (h#t) a = (if t = [] then [h]
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    62
                   else (inverse(a) * (h - hd( pquot t a)))#(pquot t a))"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    63
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    64
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    65
(* Differentiation of polynomials (needs an auxiliary function).             *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    66
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    67
consts pderiv_aux :: nat => real list => real list
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    68
primrec
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    69
   pderiv_aux_Nil  "pderiv_aux n [] = []"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    70
   pderiv_aux_Cons "pderiv_aux n (h#t) =
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    71
                     (real n * h)#(pderiv_aux (Suc n) t)"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    72
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    73
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    74
(* normalization of polynomials (remove extra 0 coeff)                       *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    75
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    76
consts pnormalize :: real list => real list
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    77
primrec 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    78
   pnormalize_Nil  "pnormalize [] = []"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    79
   pnormalize_Cons "pnormalize (h#p) = (if ( (pnormalize p) = [])
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    80
                                     then (if (h = 0) then [] else [h]) 
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    81
                                     else (h#(pnormalize p)))"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    82
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    83
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    84
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    85
(* Other definitions                                                         *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    86
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    87
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    88
constdefs
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    89
   poly_minus :: real list => real list      ("-- _" [80] 80)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    90
   "-- p == (- 1) %* p"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    91
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    92
   pderiv :: real list => real list
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    93
   "pderiv p == if p = [] then [] else pderiv_aux 1 (tl p)"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    94
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    95
   divides :: [real list,real list] => bool (infixl 70)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    96
   "p1 divides p2 == EX q. poly p2 = poly(p1 *** q)"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    97
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    98
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
    99
(* Definition of order.                                                      *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   100
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   101
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   102
   order :: real => real list => nat
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   103
   "order a p == (@n. ([-a, 1] %^ n) divides p &
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   104
                      ~ (([-a, 1] %^ (Suc n)) divides p))"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   105
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   106
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   107
(* Definition of degree.                                                     *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   108
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   109
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   110
   degree :: real list => nat
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   111
   "degree p == length (pnormalize p)"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   112
  
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   113
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   114
(* Define being "squarefree" --- NB with respect to real roots only.         *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   115
(* ------------------------------------------------------------------------- *)
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   116
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   117
   rsquarefree :: real list => bool
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   118
   "rsquarefree p == poly p ~= poly [] &
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   119
                     (ALL a. (order a p = 0) | (order a p = 1))"
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   120
02df7cbe7d25 even more theories from Jacques
paulson
parents:
diff changeset
   121
end