src/HOL/Old_Number_Theory/WilsonRuss.thy
changeset 35440 bdf8ad377877
parent 35048 82ab78fff970
child 38159 e9b4835a54ee
equal deleted inserted replaced
35439:888993948a1d 35440:bdf8ad377877
    15 
    15 
    16 definition
    16 definition
    17   inv :: "int => int => int" where
    17   inv :: "int => int => int" where
    18   "inv p a = (a^(nat (p - 2))) mod p"
    18   "inv p a = (a^(nat (p - 2))) mod p"
    19 
    19 
    20 consts
    20 fun
    21   wset :: "int * int => int set"
    21   wset :: "int \<Rightarrow> int => int set"
    22 
    22 where
    23 recdef wset
    23   "wset a p =
    24   "measure ((\<lambda>(a, p). nat a) :: int * int => nat)"
       
    25   "wset (a, p) =
       
    26     (if 1 < a then
    24     (if 1 < a then
    27       let ws = wset (a - 1, p)
    25       let ws = wset (a - 1) p
    28       in (if a \<in> ws then ws else insert a (insert (inv p a) ws)) else {})"
    26       in (if a \<in> ws then ws else insert a (insert (inv p a) ws)) else {})"
    29 
    27 
    30 
    28 
    31 text {* \medskip @{term [source] inv} *}
    29 text {* \medskip @{term [source] inv} *}
    32 
    30 
   161 declare wset.simps [simp del]
   159 declare wset.simps [simp del]
   162 
   160 
   163 lemma wset_induct:
   161 lemma wset_induct:
   164   assumes "!!a p. P {} a p"
   162   assumes "!!a p. P {} a p"
   165     and "!!a p. 1 < (a::int) \<Longrightarrow>
   163     and "!!a p. 1 < (a::int) \<Longrightarrow>
   166       P (wset (a - 1, p)) (a - 1) p ==> P (wset (a, p)) a p"
   164       P (wset (a - 1) p) (a - 1) p ==> P (wset a p) a p"
   167   shows "P (wset (u, v)) u v"
   165   shows "P (wset u v) u v"
   168   apply (rule wset.induct, safe)
   166   apply (rule wset.induct)
   169    prefer 2
   167   apply (case_tac "1 < a")
   170    apply (case_tac "1 < a")
   168    apply (rule assms)
   171     apply (rule prems)
   169     apply (simp_all add: wset.simps assms)
   172      apply simp_all
       
   173    apply (simp_all add: wset.simps prems)
       
   174   done
   170   done
   175 
   171 
   176 lemma wset_mem_imp_or [rule_format]:
   172 lemma wset_mem_imp_or [rule_format]:
   177   "1 < a \<Longrightarrow> b \<notin> wset (a - 1, p)
   173   "1 < a \<Longrightarrow> b \<notin> wset (a - 1) p
   178     ==> b \<in> wset (a, p) --> b = a \<or> b = inv p a"
   174     ==> b \<in> wset a p --> b = a \<or> b = inv p a"
   179   apply (subst wset.simps)
   175   apply (subst wset.simps)
   180   apply (unfold Let_def, simp)
   176   apply (unfold Let_def, simp)
   181   done
   177   done
   182 
   178 
   183 lemma wset_mem_mem [simp]: "1 < a ==> a \<in> wset (a, p)"
   179 lemma wset_mem_mem [simp]: "1 < a ==> a \<in> wset a p"
   184   apply (subst wset.simps)
   180   apply (subst wset.simps)
   185   apply (unfold Let_def, simp)
   181   apply (unfold Let_def, simp)
   186   done
   182   done
   187 
   183 
   188 lemma wset_subset: "1 < a \<Longrightarrow> b \<in> wset (a - 1, p) ==> b \<in> wset (a, p)"
   184 lemma wset_subset: "1 < a \<Longrightarrow> b \<in> wset (a - 1) p ==> b \<in> wset a p"
   189   apply (subst wset.simps)
   185   apply (subst wset.simps)
   190   apply (unfold Let_def, auto)
   186   apply (unfold Let_def, auto)
   191   done
   187   done
   192 
   188 
   193 lemma wset_g_1 [rule_format]:
   189 lemma wset_g_1 [rule_format]:
   194     "zprime p --> a < p - 1 --> b \<in> wset (a, p) --> 1 < b"
   190     "zprime p --> a < p - 1 --> b \<in> wset a p --> 1 < b"
   195   apply (induct a p rule: wset_induct, auto)
   191   apply (induct a p rule: wset_induct, auto)
   196   apply (case_tac "b = a")
   192   apply (case_tac "b = a")
   197    apply (case_tac [2] "b = inv p a")
   193    apply (case_tac [2] "b = inv p a")
   198     apply (subgoal_tac [3] "b = a \<or> b = inv p a")
   194     apply (subgoal_tac [3] "b = a \<or> b = inv p a")
   199      apply (rule_tac [4] wset_mem_imp_or)
   195      apply (rule_tac [4] wset_mem_imp_or)
   201        apply simp
   197        apply simp
   202        apply (rule inv_g_1, auto)
   198        apply (rule inv_g_1, auto)
   203   done
   199   done
   204 
   200 
   205 lemma wset_less [rule_format]:
   201 lemma wset_less [rule_format]:
   206     "zprime p --> a < p - 1 --> b \<in> wset (a, p) --> b < p - 1"
   202     "zprime p --> a < p - 1 --> b \<in> wset a p --> b < p - 1"
   207   apply (induct a p rule: wset_induct, auto)
   203   apply (induct a p rule: wset_induct, auto)
   208   apply (case_tac "b = a")
   204   apply (case_tac "b = a")
   209    apply (case_tac [2] "b = inv p a")
   205    apply (case_tac [2] "b = inv p a")
   210     apply (subgoal_tac [3] "b = a \<or> b = inv p a")
   206     apply (subgoal_tac [3] "b = a \<or> b = inv p a")
   211      apply (rule_tac [4] wset_mem_imp_or)
   207      apply (rule_tac [4] wset_mem_imp_or)
   214        apply (rule inv_less_p_minus_1, auto)
   210        apply (rule inv_less_p_minus_1, auto)
   215   done
   211   done
   216 
   212 
   217 lemma wset_mem [rule_format]:
   213 lemma wset_mem [rule_format]:
   218   "zprime p -->
   214   "zprime p -->
   219     a < p - 1 --> 1 < b --> b \<le> a --> b \<in> wset (a, p)"
   215     a < p - 1 --> 1 < b --> b \<le> a --> b \<in> wset a p"
   220   apply (induct a p rule: wset.induct, auto)
   216   apply (induct a p rule: wset.induct, auto)
   221   apply (rule_tac wset_subset)
   217   apply (rule_tac wset_subset)
   222   apply (simp (no_asm_simp))
   218   apply (simp (no_asm_simp))
   223   apply auto
   219   apply auto
   224   done
   220   done
   225 
   221 
   226 lemma wset_mem_inv_mem [rule_format]:
   222 lemma wset_mem_inv_mem [rule_format]:
   227   "zprime p --> 5 \<le> p --> a < p - 1 --> b \<in> wset (a, p)
   223   "zprime p --> 5 \<le> p --> a < p - 1 --> b \<in> wset a p
   228     --> inv p b \<in> wset (a, p)"
   224     --> inv p b \<in> wset a p"
   229   apply (induct a p rule: wset_induct, auto)
   225   apply (induct a p rule: wset_induct, auto)
   230    apply (case_tac "b = a")
   226    apply (case_tac "b = a")
   231     apply (subst wset.simps)
   227     apply (subst wset.simps)
   232     apply (unfold Let_def)
   228     apply (unfold Let_def)
   233     apply (rule_tac [3] wset_subset, auto)
   229     apply (rule_tac [3] wset_subset, auto)
   238         apply (rule_tac [7] wset_mem_imp_or, auto)
   234         apply (rule_tac [7] wset_mem_imp_or, auto)
   239   done
   235   done
   240 
   236 
   241 lemma wset_inv_mem_mem:
   237 lemma wset_inv_mem_mem:
   242   "zprime p \<Longrightarrow> 5 \<le> p \<Longrightarrow> a < p - 1 \<Longrightarrow> 1 < b \<Longrightarrow> b < p - 1
   238   "zprime p \<Longrightarrow> 5 \<le> p \<Longrightarrow> a < p - 1 \<Longrightarrow> 1 < b \<Longrightarrow> b < p - 1
   243     \<Longrightarrow> inv p b \<in> wset (a, p) \<Longrightarrow> b \<in> wset (a, p)"
   239     \<Longrightarrow> inv p b \<in> wset a p \<Longrightarrow> b \<in> wset a p"
   244   apply (rule_tac s = "inv p (inv p b)" and t = b in subst)
   240   apply (rule_tac s = "inv p (inv p b)" and t = b in subst)
   245    apply (rule_tac [2] wset_mem_inv_mem)
   241    apply (rule_tac [2] wset_mem_inv_mem)
   246       apply (rule inv_inv, simp_all)
   242       apply (rule inv_inv, simp_all)
   247   done
   243   done
   248 
   244 
   249 lemma wset_fin: "finite (wset (a, p))"
   245 lemma wset_fin: "finite (wset a p)"
   250   apply (induct a p rule: wset_induct)
   246   apply (induct a p rule: wset_induct)
   251    prefer 2
   247    prefer 2
   252    apply (subst wset.simps)
   248    apply (subst wset.simps)
   253    apply (unfold Let_def, auto)
   249    apply (unfold Let_def, auto)
   254   done
   250   done
   255 
   251 
   256 lemma wset_zcong_prod_1 [rule_format]:
   252 lemma wset_zcong_prod_1 [rule_format]:
   257   "zprime p -->
   253   "zprime p -->
   258     5 \<le> p --> a < p - 1 --> [(\<Prod>x\<in>wset(a, p). x) = 1] (mod p)"
   254     5 \<le> p --> a < p - 1 --> [(\<Prod>x\<in>wset a p. x) = 1] (mod p)"
   259   apply (induct a p rule: wset_induct)
   255   apply (induct a p rule: wset_induct)
   260    prefer 2
   256    prefer 2
   261    apply (subst wset.simps)
   257    apply (subst wset.simps)
   262    apply (unfold Let_def, auto)
   258    apply (auto, unfold Let_def, auto)
   263   apply (subst setprod_insert)
   259   apply (subst setprod_insert)
   264     apply (tactic {* stac (thm "setprod_insert") 3 *})
   260     apply (tactic {* stac (thm "setprod_insert") 3 *})
   265       apply (subgoal_tac [5]
   261       apply (subgoal_tac [5]
   266         "zcong (a * inv p a * (\<Prod>x\<in> wset(a - 1, p). x)) (1 * 1) p")
   262         "zcong (a * inv p a * (\<Prod>x\<in>wset (a - 1) p. x)) (1 * 1) p")
   267        prefer 5
   263        prefer 5
   268        apply (simp add: zmult_assoc)
   264        apply (simp add: zmult_assoc)
   269       apply (rule_tac [5] zcong_zmult)
   265       apply (rule_tac [5] zcong_zmult)
   270        apply (rule_tac [5] inv_is_inv)
   266        apply (rule_tac [5] inv_is_inv)
   271          apply (tactic "clarify_tac @{claset} 4")
   267          apply (tactic "clarify_tac @{claset} 4")
   272          apply (subgoal_tac [4] "a \<in> wset (a - 1, p)")
   268          apply (subgoal_tac [4] "a \<in> wset (a - 1) p")
   273           apply (rule_tac [5] wset_inv_mem_mem)
   269           apply (rule_tac [5] wset_inv_mem_mem)
   274                apply (simp_all add: wset_fin)
   270                apply (simp_all add: wset_fin)
   275   apply (rule inv_distinct, auto)
   271   apply (rule inv_distinct, auto)
   276   done
   272   done
   277 
   273 
   278 lemma d22set_eq_wset: "zprime p ==> d22set (p - 2) = wset (p - 2, p)"
   274 lemma d22set_eq_wset: "zprime p ==> d22set (p - 2) = wset (p - 2) p"
   279   apply safe
   275   apply safe
   280    apply (erule wset_mem)
   276    apply (erule wset_mem)
   281      apply (rule_tac [2] d22set_g_1)
   277      apply (rule_tac [2] d22set_g_1)
   282      apply (rule_tac [3] d22set_le)
   278      apply (rule_tac [3] d22set_le)
   283      apply (rule_tac [4] d22set_mem)
   279      apply (rule_tac [4] d22set_mem)