author | nipkow |
Mon, 17 Oct 2016 17:33:07 +0200 | |
changeset 64272 | f76b6dda2e56 |
parent 64240 | eabf80376aab |
child 64282 | 261d42f0bfac |
permissions | -rw-r--r-- |
55730
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
1 |
(* Authors: Jeremy Avigad, David Gray, and Adam Kramer |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
2 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
3 |
Ported by lcp but unfinished |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
4 |
*) |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
5 |
|
60526 | 6 |
section \<open>Gauss' Lemma\<close> |
55730
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
7 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
8 |
theory Gauss |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
9 |
imports Residues |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
10 |
begin |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
11 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
12 |
lemma cong_prime_prod_zero_nat: |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
13 |
fixes a::nat |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
14 |
shows "\<lbrakk>[a * b = 0] (mod p); prime p\<rbrakk> \<Longrightarrow> [a = 0] (mod p) | [b = 0] (mod p)" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
15 |
by (auto simp add: cong_altdef_nat) |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
16 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
17 |
lemma cong_prime_prod_zero_int: |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
18 |
fixes a::int |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
19 |
shows "\<lbrakk>[a * b = 0] (mod p); prime p\<rbrakk> \<Longrightarrow> [a = 0] (mod p) | [b = 0] (mod p)" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
20 |
by (auto simp add: cong_altdef_int) |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
21 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
22 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
23 |
locale GAUSS = |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
24 |
fixes p :: "nat" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
25 |
fixes a :: "int" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
26 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
27 |
assumes p_prime: "prime p" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
28 |
assumes p_ge_2: "2 < p" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
29 |
assumes p_a_relprime: "[a \<noteq> 0](mod p)" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
30 |
assumes a_nonzero: "0 < a" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
31 |
begin |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
32 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
33 |
definition "A = {0::int <.. ((int p - 1) div 2)}" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
34 |
definition "B = (\<lambda>x. x * a) ` A" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
35 |
definition "C = (\<lambda>x. x mod p) ` B" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
36 |
definition "D = C \<inter> {.. (int p - 1) div 2}" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
37 |
definition "E = C \<inter> {(int p - 1) div 2 <..}" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
38 |
definition "F = (\<lambda>x. (int p - x)) ` E" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
39 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
40 |
|
60526 | 41 |
subsection \<open>Basic properties of p\<close> |
55730
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
42 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
43 |
lemma odd_p: "odd p" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
44 |
by (metis p_prime p_ge_2 prime_odd_nat) |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
45 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
46 |
lemma p_minus_one_l: "(int p - 1) div 2 < p" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
47 |
proof - |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
48 |
have "(p - 1) div 2 \<le> (p - 1) div 1" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
49 |
by (metis div_by_1 div_le_dividend) |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
50 |
also have "\<dots> = p - 1" by simp |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
51 |
finally show ?thesis using p_ge_2 by arith |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
52 |
qed |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
53 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
54 |
lemma p_eq2: "int p = (2 * ((int p - 1) div 2)) + 1" |
64240 | 55 |
using odd_p p_ge_2 nonzero_mult_div_cancel_left [of 2 "p - 1"] |
58834 | 56 |
by simp |
55730
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
57 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
58 |
lemma p_odd_int: obtains z::int where "int p = 2*z+1" "0<z" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
59 |
using odd_p p_ge_2 |
58645 | 60 |
by (auto simp add: even_iff_mod_2_eq_zero) (metis p_eq2) |
55730
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
61 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
62 |
|
60526 | 63 |
subsection \<open>Basic Properties of the Gauss Sets\<close> |
55730
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
64 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
65 |
lemma finite_A: "finite (A)" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
66 |
by (auto simp add: A_def) |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
67 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
68 |
lemma finite_B: "finite (B)" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
69 |
by (auto simp add: B_def finite_A) |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
70 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
71 |
lemma finite_C: "finite (C)" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
72 |
by (auto simp add: C_def finite_B) |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
73 |
|
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk>
parents:
diff
changeset
|
74 |
lemma finite_D: "finite (D)" |
97ff9276e12d
Gauss.thy ported from Old_Number_Theory (unfinished)
paulson <lp15@cam.ac.uk> |