src/HOL/Computational_Algebra/Group_Closure.thy
author wenzelm
Fri, 05 Jul 2024 16:34:17 +0200
changeset 80517 720849fb1f37
parent 68189 6163c90694ef
permissions -rw-r--r--
merged
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
68189
6163c90694ef tuned headers;
wenzelm
parents: 67165
diff changeset
     1
(*  Title:      HOL/Computational_Algebra/Group_Closure.thy
67165
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
     2
    Author:     Johannes Hoelzl, TU Muenchen
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
     3
    Author:     Florian Haftmann, TU Muenchen
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
     4
*)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
     5
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
     6
theory Group_Closure
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
     7
imports
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
     8
  Main
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
     9
begin
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    10
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    11
context ab_group_add
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    12
begin
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    13
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    14
inductive_set group_closure :: "'a set \<Rightarrow> 'a set" for S
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    15
  where base: "s \<in> insert 0 S \<Longrightarrow> s \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    16
| diff: "s \<in> group_closure S \<Longrightarrow> t \<in> group_closure S \<Longrightarrow> s - t \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    17
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    18
lemma zero_in_group_closure [simp]:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    19
  "0 \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    20
  using group_closure.base [of 0 S] by simp
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    21
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    22
lemma group_closure_minus_iff [simp]:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    23
  "- s \<in> group_closure S \<longleftrightarrow> s \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    24
  using group_closure.diff [of 0 S s] group_closure.diff [of 0 S "- s"] by auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    25
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    26
lemma group_closure_add:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    27
  "s + t \<in> group_closure S" if "s \<in> group_closure S" and "t \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    28
  using that group_closure.diff [of s S "- t"] by auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    29
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    30
lemma group_closure_empty [simp]:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    31
  "group_closure {} = {0}"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    32
  by (rule ccontr) (auto elim: group_closure.induct)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    33
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    34
lemma group_closure_insert_zero [simp]:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    35
  "group_closure (insert 0 S) = group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    36
  by (auto elim: group_closure.induct intro: group_closure.intros)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    37
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    38
end
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    39
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    40
context comm_ring_1
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    41
begin
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    42
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    43
lemma group_closure_scalar_mult_left:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    44
  "of_nat n * s \<in> group_closure S" if "s \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    45
  using that by (induction n) (auto simp add: algebra_simps intro: group_closure_add)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    46
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    47
lemma group_closure_scalar_mult_right:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    48
  "s * of_nat n \<in> group_closure S" if "s \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    49
  using that group_closure_scalar_mult_left [of s S n] by (simp add: ac_simps)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    50
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    51
end
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    52
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    53
lemma group_closure_abs_iff [simp]:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    54
  "\<bar>s\<bar> \<in> group_closure S \<longleftrightarrow> s \<in> group_closure S" for s :: int
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    55
  by (simp add: abs_if)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    56
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    57
lemma group_closure_mult_left:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    58
  "s * t \<in> group_closure S" if "s \<in> group_closure S" for s t :: int
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    59
proof -
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    60
  from that group_closure_scalar_mult_right [of s S "nat \<bar>t\<bar>"]
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    61
    have "s * int (nat \<bar>t\<bar>) \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    62
    by (simp only:)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    63
  then show ?thesis
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    64
    by (cases "t \<ge> 0") simp_all
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    65
qed
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    66
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    67
lemma group_closure_mult_right:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    68
  "s * t \<in> group_closure S" if "t \<in> group_closure S" for s t :: int
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    69
  using that group_closure_mult_left [of t S s] by (simp add: ac_simps)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    70
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    71
context idom
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    72
begin
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    73
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    74
lemma group_closure_mult_all_eq:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    75
  "group_closure (times k ` S) = times k ` group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    76
proof (rule; rule)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    77
  fix s
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    78
  have *: "k * a + k * b = k * (a + b)"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    79
    "k * a - k * b = k * (a - b)" for a b
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    80
    by (simp_all add: algebra_simps)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    81
  assume "s \<in> group_closure (times k ` S)"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    82
  then show "s \<in> times k ` group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    83
    by induction (auto simp add: * image_iff intro: group_closure.base group_closure.diff bexI [of _ 0])
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    84
next
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    85
  fix s
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    86
  assume "s \<in> times k ` group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    87
  then obtain r where r: "r \<in> group_closure S" and s: "s = k * r"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    88
    by auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    89
  from r have "k * r \<in> group_closure (times k ` S)"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    90
    by (induction arbitrary: s) (auto simp add: algebra_simps intro: group_closure.intros)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    91
  with s show "s \<in> group_closure (times k ` S)"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    92
    by simp
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    93
qed
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    94
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    95
end
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    96
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    97
lemma Gcd_group_closure_eq_Gcd:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    98
  "Gcd (group_closure S) = Gcd S" for S :: "int set"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
    99
proof (rule associated_eqI)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   100
  have "Gcd S dvd s" if "s \<in> group_closure S" for s
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   101
    using that by induction auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   102
  then show "Gcd S dvd Gcd (group_closure S)"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   103
    by auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   104
  have "Gcd (group_closure S) dvd s" if "s \<in> S" for s
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   105
  proof -
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   106
    from that have "s \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   107
      by (simp add: group_closure.base)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   108
    then show ?thesis
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   109
      by (rule Gcd_dvd)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   110
  qed
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   111
  then show "Gcd (group_closure S) dvd Gcd S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   112
    by auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   113
qed simp_all
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   114
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   115
lemma group_closure_sum:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   116
  fixes S :: "int set"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   117
  assumes X: "finite X" "X \<noteq> {}" "X \<subseteq> S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   118
  shows "(\<Sum>x\<in>X. a x * x) \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   119
  using X by (induction X rule: finite_ne_induct)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   120
    (auto intro: group_closure_mult_right group_closure.base group_closure_add)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   121
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   122
lemma Gcd_group_closure_in_group_closure:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   123
  "Gcd (group_closure S) \<in> group_closure S" for S :: "int set"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   124
proof (cases "S \<subseteq> {0}")
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   125
  case True
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   126
  then have "S = {} \<or> S = {0}"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   127
    by auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   128
  then show ?thesis
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   129
    by auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   130
next
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   131
  case False
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   132
  then obtain s where s: "s \<noteq> 0" "s \<in> S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   133
    by auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   134
  then have s': "\<bar>s\<bar> \<noteq> 0" "\<bar>s\<bar> \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   135
    by (auto intro: group_closure.base)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   136
  define m where "m = (LEAST n. n > 0 \<and> int n \<in> group_closure S)"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   137
  have "m > 0 \<and> int m \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   138
    unfolding m_def
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   139
    apply (rule LeastI [of _ "nat \<bar>s\<bar>"])
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   140
    using s'
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   141
    by simp
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   142
  then have m: "int m \<in> group_closure S" and "0 < m"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   143
    by auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   144
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   145
  have "Gcd (group_closure S) = int m"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   146
  proof (rule associated_eqI)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   147
    from m show "Gcd (group_closure S) dvd int m"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   148
      by (rule Gcd_dvd)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   149
    show "int m dvd Gcd (group_closure S)"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   150
    proof (rule Gcd_greatest)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   151
      fix s
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   152
      assume s: "s \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   153
      show "int m dvd s"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   154
      proof (rule ccontr)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   155
        assume "\<not> int m dvd s"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   156
        then have *: "0 < s mod int m"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   157
          using \<open>0 < m\<close> le_less by fastforce
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   158
        have "m \<le> nat (s mod int m)"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   159
        proof (subst m_def, rule Least_le, rule)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   160
          from * show "0 < nat (s mod int m)"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   161
            by simp
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   162
          from minus_div_mult_eq_mod [symmetric, of s "int m"]
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   163
          have "s mod int m = s - s div int m * int m"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   164
            by auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   165
          also have "s - s div int m * int m \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   166
            by (auto intro: group_closure.diff s group_closure_mult_right m)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   167
          finally  show "int (nat (s mod int m)) \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   168
            by simp
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   169
        qed
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   170
        with * have "int m \<le> s mod int m"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   171
          by simp
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   172
        moreover have "s mod int m < int m"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   173
          using \<open>0 < m\<close> by simp
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   174
        ultimately show False
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   175
          by auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   176
      qed
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   177
    qed
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   178
  qed simp_all
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   179
  with m show ?thesis
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   180
    by simp
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   181
qed
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   182
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   183
lemma Gcd_in_group_closure:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   184
  "Gcd S \<in> group_closure S" for S :: "int set"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   185
  using Gcd_group_closure_in_group_closure [of S]
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   186
  by (simp add: Gcd_group_closure_eq_Gcd)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   187
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   188
lemma group_closure_eq:
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   189
  "group_closure S = range (times (Gcd S))" for S :: "int set"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   190
proof (auto intro: Gcd_in_group_closure group_closure_mult_left)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   191
  fix s
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   192
  assume "s \<in> group_closure S"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   193
  then show "s \<in> range (times (Gcd S))"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   194
  proof induction
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   195
    case (base s)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   196
    then have "Gcd S dvd s"
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   197
      by (auto intro: Gcd_dvd)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   198
    then obtain t where "s = Gcd S * t" ..
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   199
    then show ?case
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   200
      by auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   201
  next
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   202
    case (diff s t)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   203
    moreover have "Gcd S * a - Gcd S * b = Gcd S * (a - b)" for a b
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   204
      by (simp add: algebra_simps)
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   205
    ultimately show ?case
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   206
      by auto
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   207
  qed
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   208
qed
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   209
22a5822f52f7 dedicated theory for group closure
haftmann
parents:
diff changeset
   210
end