| author | wenzelm | 
| Wed, 08 Nov 2006 21:45:15 +0100 | |
| changeset 21254 | d53f76357f41 | 
| parent 19802 | c2860c37e574 | 
| child 30042 | 31039ee583fa | 
| permissions | -rw-r--r-- | 
| 1476 | 1  | 
(* Title: HOL/Hoare/Arith2.thy  | 
| 1335 | 2  | 
ID: $Id$  | 
| 1476 | 3  | 
Author: Norbert Galm  | 
| 1335 | 4  | 
Copyright 1995 TUM  | 
5  | 
||
| 
3372
 
6e472c8f0011
Replacement of "divides" by "dvd" from Divides.thy, and updating of proofs
 
paulson 
parents: 
1824 
diff
changeset
 | 
6  | 
More arithmetic. Much of this duplicates ex/Primes.  | 
| 1335 | 7  | 
*)  | 
8  | 
||
| 17278 | 9  | 
theory Arith2  | 
10  | 
imports Main  | 
|
11  | 
begin  | 
|
| 1335 | 12  | 
|
| 1558 | 13  | 
constdefs  | 
| 17278 | 14  | 
"cd" :: "[nat, nat, nat] => bool"  | 
| 
3372
 
6e472c8f0011
Replacement of "divides" by "dvd" from Divides.thy, and updating of proofs
 
paulson 
parents: 
1824 
diff
changeset
 | 
15  | 
"cd x m n == x dvd m & x dvd n"  | 
| 1335 | 16  | 
|
| 17278 | 17  | 
gcd :: "[nat, nat] => nat"  | 
| 1558 | 18  | 
"gcd m n == @x.(cd x m n) & (!y.(cd y m n) --> y<=x)"  | 
| 1335 | 19  | 
|
| 17278 | 20  | 
consts fac :: "nat => nat"  | 
| 5183 | 21  | 
|
22  | 
primrec  | 
|
23  | 
"fac 0 = Suc 0"  | 
|
24  | 
"fac(Suc n) = (Suc n)*fac(n)"  | 
|
| 1335 | 25  | 
|
| 19802 | 26  | 
|
27  | 
subsubsection {* cd *}
 | 
|
28  | 
||
29  | 
lemma cd_nnn: "0<n ==> cd n n n"  | 
|
30  | 
apply (simp add: cd_def)  | 
|
31  | 
done  | 
|
32  | 
||
33  | 
lemma cd_le: "[| cd x m n; 0<m; 0<n |] ==> x<=m & x<=n"  | 
|
34  | 
apply (unfold cd_def)  | 
|
35  | 
apply (blast intro: dvd_imp_le)  | 
|
36  | 
done  | 
|
37  | 
||
38  | 
lemma cd_swap: "cd x m n = cd x n m"  | 
|
39  | 
apply (unfold cd_def)  | 
|
40  | 
apply blast  | 
|
41  | 
done  | 
|
42  | 
||
43  | 
lemma cd_diff_l: "n<=m ==> cd x m n = cd x (m-n) n"  | 
|
44  | 
apply (unfold cd_def)  | 
|
45  | 
apply (blast intro: dvd_diff dest: dvd_diffD)  | 
|
46  | 
done  | 
|
47  | 
||
48  | 
lemma cd_diff_r: "m<=n ==> cd x m n = cd x m (n-m)"  | 
|
49  | 
apply (unfold cd_def)  | 
|
50  | 
apply (blast intro: dvd_diff dest: dvd_diffD)  | 
|
51  | 
done  | 
|
52  | 
||
53  | 
||
54  | 
subsubsection {* gcd *}
 | 
|
55  | 
||
56  | 
lemma gcd_nnn: "0<n ==> n = gcd n n"  | 
|
57  | 
apply (unfold gcd_def)  | 
|
58  | 
apply (frule cd_nnn)  | 
|
59  | 
apply (rule some_equality [symmetric])  | 
|
60  | 
apply (blast dest: cd_le)  | 
|
61  | 
apply (blast intro: le_anti_sym dest: cd_le)  | 
|
62  | 
done  | 
|
63  | 
||
64  | 
lemma gcd_swap: "gcd m n = gcd n m"  | 
|
65  | 
apply (simp add: gcd_def cd_swap)  | 
|
66  | 
done  | 
|
67  | 
||
68  | 
lemma gcd_diff_l: "n<=m ==> gcd m n = gcd (m-n) n"  | 
|
69  | 
apply (unfold gcd_def)  | 
|
70  | 
apply (subgoal_tac "n<=m ==> !x. cd x m n = cd x (m-n) n")  | 
|
71  | 
apply simp  | 
|
72  | 
apply (rule allI)  | 
|
73  | 
apply (erule cd_diff_l)  | 
|
74  | 
done  | 
|
75  | 
||
76  | 
lemma gcd_diff_r: "m<=n ==> gcd m n = gcd m (n-m)"  | 
|
77  | 
apply (unfold gcd_def)  | 
|
78  | 
apply (subgoal_tac "m<=n ==> !x. cd x m n = cd x m (n-m) ")  | 
|
79  | 
apply simp  | 
|
80  | 
apply (rule allI)  | 
|
81  | 
apply (erule cd_diff_r)  | 
|
82  | 
done  | 
|
83  | 
||
84  | 
||
85  | 
subsubsection {* pow *}
 | 
|
86  | 
||
87  | 
lemma sq_pow_div2 [simp]:  | 
|
88  | 
"m mod 2 = 0 ==> ((n::nat)*n)^(m div 2) = n^m"  | 
|
89  | 
apply (simp add: power2_eq_square [symmetric] power_mult [symmetric] mult_div_cancel)  | 
|
90  | 
done  | 
|
| 17278 | 91  | 
|
| 1335 | 92  | 
end  |