| author | ballarin | 
| Thu, 19 Feb 2004 16:44:21 +0100 | |
| changeset 14399 | dc677b35e54f | 
| parent 13870 | cf947d1ec5ff | 
| child 14706 | 71590b7733b7 | 
| permissions | -rw-r--r-- | 
| 
13870
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
1  | 
(* Title: HOL/GroupTheory/Exponent  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
2  | 
ID: $Id$  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
3  | 
Author: Florian Kammueller, with new proofs by L C Paulson  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
4  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
5  | 
exponent p s yields the greatest power of p that divides s.  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
6  | 
*)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
7  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
8  | 
header{*The Combinatorial Argument Underlying the First Sylow Theorem*}
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
9  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
10  | 
theory Exponent = Main + Primes:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
11  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
12  | 
constdefs  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
13  | 
exponent :: "[nat, nat] => nat"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
14  | 
"exponent p s == if p \<in> prime then (GREATEST r. p^r dvd s) else 0"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
15  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
16  | 
subsection{*Prime Theorems*}
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
17  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
18  | 
lemma prime_imp_one_less: "p \<in> prime ==> Suc 0 < p"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
19  | 
by (unfold prime_def, force)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
20  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
21  | 
lemma prime_iff:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
22  | 
"(p \<in> prime) = (Suc 0 < p & (\<forall>a b. p dvd a*b --> (p dvd a) | (p dvd b)))"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
23  | 
apply (auto simp add: prime_imp_one_less)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
24  | 
apply (blast dest!: prime_dvd_mult)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
25  | 
apply (auto simp add: prime_def)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
26  | 
apply (erule dvdE)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
27  | 
apply (case_tac "k=0", simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
28  | 
apply (drule_tac x = m in spec)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
29  | 
apply (drule_tac x = k in spec)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
30  | 
apply (simp add: dvd_mult_cancel1 dvd_mult_cancel2, auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
31  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
32  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
33  | 
lemma zero_less_prime_power: "p \<in> prime ==> 0 < p^a"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
34  | 
by (force simp add: prime_iff)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
35  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
36  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
37  | 
lemma le_extend_mult: "[| 0 < c; a <= b |] ==> a <= b * (c::nat)"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
38  | 
apply (rule_tac P = "%x. x <= b * c" in subst)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
39  | 
apply (rule mult_1_right)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
40  | 
apply (rule mult_le_mono, auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
41  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
42  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
43  | 
lemma insert_partition:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
44  | 
     "[| x \<notin> F; \<forall>c1\<in>insert x F. \<forall>c2 \<in> insert x F. c1 \<noteq> c2 --> c1 \<inter> c2 = {}|] 
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
45  | 
      ==> x \<inter> \<Union> F = {}"
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
46  | 
by auto  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
47  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
48  | 
(* main cardinality theorem *)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
49  | 
lemma card_partition [rule_format]:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
50  | 
"finite C ==>  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
51  | 
finite (\<Union> C) -->  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
52  | 
(\<forall>c\<in>C. card c = k) -->  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
53  | 
        (\<forall>c1 \<in> C. \<forall>c2 \<in> C. c1 \<noteq> c2 --> c1 \<inter> c2 = {}) -->  
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
54  | 
k * card(C) = card (\<Union> C)"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
55  | 
apply (erule finite_induct, simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
56  | 
apply (simp add: card_insert_disjoint card_Un_disjoint insert_partition  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
57  | 
finite_subset [of _ "\<Union> (insert x F)"])  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
58  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
59  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
60  | 
lemma zero_less_card_empty: "[| finite S; S \<noteq> {} |] ==> 0 < card(S)"
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
61  | 
by (rule ccontr, simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
62  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
63  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
64  | 
lemma prime_dvd_cases:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
65  | 
"[| p*k dvd m*n; p \<in> prime |]  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
66  | 
==> (\<exists>x. k dvd x*n & m = p*x) | (\<exists>y. k dvd m*y & n = p*y)"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
67  | 
apply (simp add: prime_iff)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
68  | 
apply (frule dvd_mult_left)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
69  | 
apply (subgoal_tac "p dvd m | p dvd n")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
70  | 
prefer 2 apply blast  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
71  | 
apply (erule disjE)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
72  | 
apply (rule disjI1)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
73  | 
apply (rule_tac [2] disjI2)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
74  | 
apply (erule_tac n = m in dvdE)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
75  | 
apply (erule_tac [2] n = n in dvdE, auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
76  | 
apply (rule_tac [2] k = p in dvd_mult_cancel)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
77  | 
apply (rule_tac k = p in dvd_mult_cancel)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
78  | 
apply (simp_all add: mult_ac)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
79  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
80  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
81  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
82  | 
lemma prime_power_dvd_cases [rule_format (no_asm)]: "p \<in> prime  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
83  | 
==> \<forall>m n. p^c dvd m*n -->  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
84  | 
(\<forall>a b. a+b = Suc c --> p^a dvd m | p^b dvd n)"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
85  | 
apply (induct_tac "c")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
86  | 
apply clarify  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
87  | 
apply (case_tac "a")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
88  | 
apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
89  | 
apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
90  | 
(*inductive step*)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
91  | 
apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
92  | 
apply clarify  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
93  | 
apply (erule prime_dvd_cases [THEN disjE], assumption, auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
94  | 
(*case 1: p dvd m*)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
95  | 
apply (case_tac "a")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
96  | 
apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
97  | 
apply clarify  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
98  | 
apply (drule spec, drule spec, erule (1) notE impE)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
99  | 
apply (drule_tac x = nat in spec)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
100  | 
apply (drule_tac x = b in spec)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
101  | 
apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
102  | 
apply (blast intro: dvd_refl mult_dvd_mono)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
103  | 
(*case 2: p dvd n*)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
104  | 
apply (case_tac "b")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
105  | 
apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
106  | 
apply clarify  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
107  | 
apply (drule spec, drule spec, erule (1) notE impE)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
108  | 
apply (drule_tac x = a in spec)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
109  | 
apply (drule_tac x = nat in spec, simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
110  | 
apply (blast intro: dvd_refl mult_dvd_mono)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
111  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
112  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
113  | 
(*needed in this form in Sylow.ML*)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
114  | 
lemma div_combine:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
115  | 
"[| p \<in> prime; ~ (p ^ (Suc r) dvd n); p^(a+r) dvd n*k |]  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
116  | 
==> p ^ a dvd k"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
117  | 
by (drule_tac a = "Suc r" and b = a in prime_power_dvd_cases, assumption, auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
118  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
119  | 
(*Lemma for power_dvd_bound*)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
120  | 
lemma Suc_le_power: "Suc 0 < p ==> Suc n <= p^n"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
121  | 
apply (induct_tac "n")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
122  | 
apply (simp (no_asm_simp))  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
123  | 
apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
124  | 
apply (subgoal_tac "2 * n + 2 <= p * p^n", simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
125  | 
apply (subgoal_tac "2 * p^n <= p * p^n")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
126  | 
(*?arith_tac should handle all of this!*)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
127  | 
apply (rule order_trans)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
128  | 
prefer 2 apply assumption  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
129  | 
apply (drule_tac k = 2 in mult_le_mono2, simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
130  | 
apply (rule mult_le_mono1, simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
131  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
132  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
133  | 
(*An upper bound for the n such that p^n dvd a: needed for GREATEST to exist*)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
134  | 
lemma power_dvd_bound: "[|p^n dvd a; Suc 0 < p; 0 < a|] ==> n < a"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
135  | 
apply (drule dvd_imp_le)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
136  | 
apply (drule_tac [2] n = n in Suc_le_power, auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
137  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
138  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
139  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
140  | 
subsection{*Exponent Theorems*}
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
141  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
142  | 
lemma exponent_ge [rule_format]:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
143  | 
"[|p^k dvd n; p \<in> prime; 0<n|] ==> k <= exponent p n"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
144  | 
apply (simp add: exponent_def)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
145  | 
apply (erule Greatest_le)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
146  | 
apply (blast dest: prime_imp_one_less power_dvd_bound)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
147  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
148  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
149  | 
lemma power_exponent_dvd: "0<s ==> (p ^ exponent p s) dvd s"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
150  | 
apply (simp add: exponent_def)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
151  | 
apply clarify  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
152  | 
apply (rule_tac k = 0 in GreatestI)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
153  | 
prefer 2 apply (blast dest: prime_imp_one_less power_dvd_bound, simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
154  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
155  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
156  | 
lemma power_Suc_exponent_Not_dvd:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
157  | 
"[|(p * p ^ exponent p s) dvd s; p \<in> prime |] ==> s=0"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
158  | 
apply (subgoal_tac "p ^ Suc (exponent p s) dvd s")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
159  | 
prefer 2 apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
160  | 
apply (rule ccontr)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
161  | 
apply (drule exponent_ge, auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
162  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
163  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
164  | 
lemma exponent_power_eq [simp]: "p \<in> prime ==> exponent p (p^a) = a"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
165  | 
apply (simp (no_asm_simp) add: exponent_def)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
166  | 
apply (rule Greatest_equality, simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
167  | 
apply (simp (no_asm_simp) add: prime_imp_one_less power_dvd_imp_le)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
168  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
169  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
170  | 
lemma exponent_equalityI:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
171  | 
"!r::nat. (p^r dvd a) = (p^r dvd b) ==> exponent p a = exponent p b"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
172  | 
by (simp (no_asm_simp) add: exponent_def)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
173  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
174  | 
lemma exponent_eq_0 [simp]: "p \<notin> prime ==> exponent p s = 0"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
175  | 
by (simp (no_asm_simp) add: exponent_def)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
176  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
177  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
178  | 
(* exponent_mult_add, easy inclusion. Could weaken p \<in> prime to Suc 0 < p *)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
179  | 
lemma exponent_mult_add1:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
180  | 
"[| 0 < a; 0 < b |]  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
181  | 
==> (exponent p a) + (exponent p b) <= exponent p (a * b)"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
182  | 
apply (case_tac "p \<in> prime")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
183  | 
apply (rule exponent_ge)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
184  | 
apply (auto simp add: power_add)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
185  | 
apply (blast intro: prime_imp_one_less power_exponent_dvd mult_dvd_mono)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
186  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
187  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
188  | 
(* exponent_mult_add, opposite inclusion *)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
189  | 
lemma exponent_mult_add2: "[| 0 < a; 0 < b |]  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
190  | 
==> exponent p (a * b) <= (exponent p a) + (exponent p b)"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
191  | 
apply (case_tac "p \<in> prime")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
192  | 
apply (rule leI, clarify)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
193  | 
apply (cut_tac p = p and s = "a*b" in power_exponent_dvd, auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
194  | 
apply (subgoal_tac "p ^ (Suc (exponent p a + exponent p b)) dvd a * b")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
195  | 
apply (rule_tac [2] le_imp_power_dvd [THEN dvd_trans])  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
196  | 
prefer 3 apply assumption  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
197  | 
prefer 2 apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
198  | 
apply (frule_tac a = "Suc (exponent p a) " and b = "Suc (exponent p b) " in prime_power_dvd_cases)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
199  | 
apply (assumption, force, simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
200  | 
apply (blast dest: power_Suc_exponent_Not_dvd)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
201  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
202  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
203  | 
lemma exponent_mult_add:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
204  | 
"[| 0 < a; 0 < b |]  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
205  | 
==> exponent p (a * b) = (exponent p a) + (exponent p b)"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
206  | 
by (blast intro: exponent_mult_add1 exponent_mult_add2 order_antisym)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
207  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
208  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
209  | 
lemma not_divides_exponent_0: "~ (p dvd n) ==> exponent p n = 0"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
210  | 
apply (case_tac "exponent p n", simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
211  | 
apply (case_tac "n", simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
212  | 
apply (cut_tac s = n and p = p in power_exponent_dvd)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
213  | 
apply (auto dest: dvd_mult_left)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
214  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
215  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
216  | 
lemma exponent_1_eq_0 [simp]: "exponent p (Suc 0) = 0"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
217  | 
apply (case_tac "p \<in> prime")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
218  | 
apply (auto simp add: prime_iff not_divides_exponent_0)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
219  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
220  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
221  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
222  | 
subsection{*Lemmas for the Main Combinatorial Argument*}
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
223  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
224  | 
lemma p_fac_forw_lemma:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
225  | 
"[| 0 < (m::nat); 0<k; k < p^a; (p^r) dvd (p^a)* m - k |] ==> r <= a"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
226  | 
apply (rule notnotD)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
227  | 
apply (rule notI)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
228  | 
apply (drule contrapos_nn [OF _ leI, THEN notnotD], assumption)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
229  | 
apply (drule_tac m = a in less_imp_le)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
230  | 
apply (drule le_imp_power_dvd)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
231  | 
apply (drule_tac n = "p ^ r" in dvd_trans, assumption)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
232  | 
apply (frule_tac m = k in less_imp_le)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
233  | 
apply (drule_tac c = m in le_extend_mult, assumption)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
234  | 
apply (drule_tac k = "p ^ a" and m = " (p ^ a) * m" in dvd_diffD1)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
235  | 
prefer 2 apply assumption  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
236  | 
apply (rule dvd_refl [THEN dvd_mult2])  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
237  | 
apply (drule_tac n = k in dvd_imp_le, auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
238  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
239  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
240  | 
lemma p_fac_forw: "[| 0 < (m::nat); 0<k; k < p^a; (p^r) dvd (p^a)* m - k |]  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
241  | 
==> (p^r) dvd (p^a) - k"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
242  | 
apply (frule_tac k1 = k and i = p in p_fac_forw_lemma [THEN le_imp_power_dvd], auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
243  | 
apply (subgoal_tac "p^r dvd p^a*m")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
244  | 
prefer 2 apply (blast intro: dvd_mult2)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
245  | 
apply (drule dvd_diffD1)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
246  | 
apply assumption  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
247  | 
prefer 2 apply (blast intro: dvd_diff)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
248  | 
apply (drule less_imp_Suc_add, auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
249  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
250  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
251  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
252  | 
lemma r_le_a_forw: "[| 0 < (k::nat); k < p^a; 0 < p; (p^r) dvd (p^a) - k |] ==> r <= a"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
253  | 
by (rule_tac m = "Suc 0" in p_fac_forw_lemma, auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
254  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
255  | 
lemma p_fac_backw: "[| 0<m; 0<k; 0 < (p::nat); k < p^a; (p^r) dvd p^a - k |]  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
256  | 
==> (p^r) dvd (p^a)*m - k"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
257  | 
apply (frule_tac k1 = k and i = p in r_le_a_forw [THEN le_imp_power_dvd], auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
258  | 
apply (subgoal_tac "p^r dvd p^a*m")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
259  | 
prefer 2 apply (blast intro: dvd_mult2)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
260  | 
apply (drule dvd_diffD1)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
261  | 
apply assumption  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
262  | 
prefer 2 apply (blast intro: dvd_diff)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
263  | 
apply (drule less_imp_Suc_add, auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
264  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
265  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
266  | 
lemma exponent_p_a_m_k_equation: "[| 0<m; 0<k; 0 < (p::nat); k < p^a |]  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
267  | 
==> exponent p (p^a * m - k) = exponent p (p^a - k)"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
268  | 
apply (blast intro: exponent_equalityI p_fac_forw p_fac_backw)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
269  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
270  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
271  | 
text{*Suc rules that we have to delete from the simpset*}
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
272  | 
lemmas bad_Sucs = binomial_Suc_Suc mult_Suc mult_Suc_right  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
273  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
274  | 
(*The bound K is needed; otherwise it's too weak to be used.*)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
275  | 
lemma p_not_div_choose_lemma [rule_format]:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
276  | 
"[| \<forall>i. Suc i < K --> exponent p (Suc i) = exponent p (Suc(j+i))|]  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
277  | 
==> k<K --> exponent p ((j+k) choose k) = 0"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
278  | 
apply (case_tac "p \<in> prime")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
279  | 
prefer 2 apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
280  | 
apply (induct_tac "k")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
281  | 
apply (simp (no_asm))  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
282  | 
(*induction step*)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
283  | 
apply (subgoal_tac "0 < (Suc (j+n) choose Suc n) ")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
284  | 
prefer 2 apply (simp add: zero_less_binomial_iff, clarify)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
285  | 
apply (subgoal_tac "exponent p ((Suc (j+n) choose Suc n) * Suc n) =  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
286  | 
exponent p (Suc n)")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
287  | 
 txt{*First, use the assumed equation.  We simplify the LHS to
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
288  | 
  @{term "exponent p (Suc (j + n) choose Suc n) + exponent p (Suc n)"}
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
289  | 
the common terms cancel, proving the conclusion.*}  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
290  | 
apply (simp del: bad_Sucs add: exponent_mult_add)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
291  | 
txt{*Establishing the equation requires first applying 
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
292  | 
   @{text Suc_times_binomial_eq} ...*}
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
293  | 
apply (simp del: bad_Sucs add: Suc_times_binomial_eq [symmetric])  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
294  | 
txt{*...then @{text exponent_mult_add} and the quantified premise.*}
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
295  | 
apply (simp del: bad_Sucs add: zero_less_binomial_iff exponent_mult_add)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
296  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
297  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
298  | 
(*The lemma above, with two changes of variables*)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
299  | 
lemma p_not_div_choose:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
300  | 
"[| k<K; k<=n;  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
301  | 
\<forall>j. 0<j & j<K --> exponent p (n - k + (K - j)) = exponent p (K - j)|]  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
302  | 
==> exponent p (n choose k) = 0"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
303  | 
apply (cut_tac j = "n-k" and k = k and p = p in p_not_div_choose_lemma)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
304  | 
prefer 3 apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
305  | 
prefer 2 apply assumption  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
306  | 
apply (drule_tac x = "K - Suc i" in spec)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
307  | 
apply (simp add: Suc_diff_le)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
308  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
309  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
310  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
311  | 
lemma const_p_fac_right:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
312  | 
"0 < m ==> exponent p ((p^a * m - Suc 0) choose (p^a - Suc 0)) = 0"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
313  | 
apply (case_tac "p \<in> prime")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
314  | 
prefer 2 apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
315  | 
apply (frule_tac a = a in zero_less_prime_power)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
316  | 
apply (rule_tac K = "p^a" in p_not_div_choose)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
317  | 
apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
318  | 
apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
319  | 
apply (case_tac "m")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
320  | 
apply (case_tac [2] "p^a")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
321  | 
apply auto  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
322  | 
(*now the hard case, simplified to  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
323  | 
exponent p (Suc (p ^ a * m + i - p ^ a)) = exponent p (Suc i) *)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
324  | 
apply (subgoal_tac "0<p")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
325  | 
prefer 2 apply (force dest!: prime_imp_one_less)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
326  | 
apply (subst exponent_p_a_m_k_equation, auto)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
327  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
328  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
329  | 
lemma const_p_fac:  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
330  | 
"0 < m ==> exponent p (((p^a) * m) choose p^a) = exponent p m"  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
331  | 
apply (case_tac "p \<in> prime")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
332  | 
prefer 2 apply simp  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
333  | 
apply (subgoal_tac "0 < p^a * m & p^a <= p^a * m")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
334  | 
prefer 2 apply (force simp add: prime_iff)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
335  | 
txt{*A similar trick to the one used in @{text p_not_div_choose_lemma}:
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
336  | 
  insert an equation; use @{text exponent_mult_add} on the LHS; on the RHS,
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
337  | 
first  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
338  | 
  transform the binomial coefficient, then use @{text exponent_mult_add}.*}
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
339  | 
apply (subgoal_tac "exponent p ((( (p^a) * m) choose p^a) * p^a) =  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
340  | 
a + exponent p m")  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
341  | 
apply (simp del: bad_Sucs add: zero_less_binomial_iff exponent_mult_add prime_iff)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
342  | 
txt{*one subgoal left!*}
 | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
343  | 
apply (subst times_binomial_minus1_eq, simp, simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
344  | 
apply (subst exponent_mult_add, simp)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
345  | 
apply (simp (no_asm_simp) add: zero_less_binomial_iff)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
346  | 
apply arith  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
347  | 
apply (simp del: bad_Sucs add: exponent_mult_add const_p_fac_right)  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
348  | 
done  | 
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
349  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
350  | 
|
| 
 
cf947d1ec5ff
moved Exponent, Coset, Sylow from GroupTheory to Algebra, converting them
 
paulson 
parents:  
diff
changeset
 | 
351  | 
end  |