Theory "gcd"

Parents     prime

Signature

Constant Type
gcd :num -> num -> num
gcd_tupled :num # num -> num
is_gcd :num -> num -> num -> bool

Definitions

is_gcd_def
|- !a b c.
     is_gcd a b c =
     divides c a /\ divides c b /\
     !d. divides d a /\ divides d b ==> divides d c
gcd_tupled_primitive_def
|- gcd_tupled =
   WFREC
     (@R.
        WF R /\ (!x y. ~(y <= x) ==> R (SUC x,y - x) (SUC x,SUC y)) /\
        !x y. y <= x ==> R (x - y,SUC y) (SUC x,SUC y))
     (\gcd_tupled' a.
        case a of
           (v,v1) ->
             case v of
                0 -> v1
             || SUC v2 ->
                  case v1 of
                     0 -> SUC v2
                  || SUC v3 ->
                       (if v3 <= v2 then
                          gcd_tupled' (v2 - v3,SUC v3)
                        else
                          gcd_tupled' (SUC v2,v3 - v2)))
gcd_curried_def
|- !x x1. gcd x x1 = gcd_tupled (x,x1)


Theorems

IS_GCD_UNIQUE
|- !a b c d. is_gcd a b c /\ is_gcd a b d ==> (c = d)
IS_GCD_REF
|- !a. is_gcd a a a
IS_GCD_SYM
|- !a b c. is_gcd a b c = is_gcd b a c
IS_GCD_0R
|- !a. is_gcd 0 a a
PRIME_IS_GCD
|- !p b. prime p ==> divides p b \/ is_gcd p b 1
IS_GCD_MINUS_L
|- !a b c. b <= a /\ is_gcd (a - b) b c ==> is_gcd a b c
IS_GCD_MINUS_R
|- !a b c. a <= b /\ is_gcd a (b - a) c ==> is_gcd a b c
gcd_ind
|- !P.
     (!y. P 0 y) /\ (!x. P (SUC x) 0) /\
     (!x y.
        (~(y <= x) ==> P (SUC x) (y - x)) /\
        (y <= x ==> P (x - y) (SUC y)) ==>
        P (SUC x) (SUC y)) ==>
     !v v1. P v v1
gcd_def
|- (gcd 0 y = y) /\ (gcd (SUC x) 0 = SUC x) /\
   (gcd (SUC x) (SUC y) =
    (if y <= x then gcd (x - y) (SUC y) else gcd (SUC x) (y - x)))
GCD_IS_GCD
|- !a b. is_gcd a b (gcd a b)
GCD_REF
|- !a. gcd a a = a
GCD_SYM
|- !a b. gcd a b = gcd b a
GCD_0R
|- !a. gcd a 0 = a
GCD_0L
|- !a. gcd 0 a = a
GCD_ADD_R
|- !a b. gcd a (a + b) = gcd a b
GCD_ADD_L
|- !a b. gcd (a + b) a = gcd a b
GCD_EQ_0
|- !n m. (gcd n m = 0) = (n = 0) /\ (m = 0)
PRIME_GCD
|- !p b. prime p ==> divides p b \/ (gcd p b = 1)
L_EUCLIDES
|- !a b c. (gcd a b = 1) /\ divides b (a * c) ==> divides b c
P_EUCLIDES
|- !p a b. prime p /\ divides p (a * b) ==> divides p a \/ divides p b
FACTOR_OUT_GCD
|- !n m.
     ~(n = 0) /\ ~(m = 0) ==>
     ?p q. (n = p * gcd n m) /\ (m = q * gcd n m) /\ (gcd p q = 1)
LINEAR_GCD
|- !n m. ~(n = 0) ==> ?p q. p * n = q * m + gcd m n
GCD_EFFICIENTLY
|- !a b. gcd a b = (if a = 0 then b else gcd (b MOD a) a)