src/HOL/Divides.thy
changeset 64164 38c407446400
parent 64014 ca1239a3277b
child 64238 b60a9752b6d0
equal deleted inserted replaced
64163:62c9e5c05928 64164:38c407446400
     9 imports Parity
     9 imports Parity
    10 begin
    10 begin
    11 
    11 
    12 subsection \<open>Abstract division in commutative semirings.\<close>
    12 subsection \<open>Abstract division in commutative semirings.\<close>
    13 
    13 
    14 class semiring_div = semidom + modulo +
    14 class semiring_div = semidom + semiring_modulo +
    15   assumes mod_div_equality: "a div b * b + a mod b = a"
    15   assumes div_by_0: "a div 0 = 0"
    16     and div_by_0: "a div 0 = 0"
       
    17     and div_0: "0 div a = 0"
    16     and div_0: "0 div a = 0"
    18     and div_mult_self1 [simp]: "b \<noteq> 0 \<Longrightarrow> (a + c * b) div b = c + a div b"
    17     and div_mult_self1 [simp]: "b \<noteq> 0 \<Longrightarrow> (a + c * b) div b = c + a div b"
    19     and div_mult_mult1 [simp]: "c \<noteq> 0 \<Longrightarrow> (c * a) div (c * b) = a div b"
    18     and div_mult_mult1 [simp]: "c \<noteq> 0 \<Longrightarrow> (c * a) div (c * b) = a div b"
    20 begin
    19 begin
    21 
    20 
    38 lemma div_mult_self2_is_id:
    37 lemma div_mult_self2_is_id:
    39   "b \<noteq> 0 \<Longrightarrow> a * b div b = a"
    38   "b \<noteq> 0 \<Longrightarrow> a * b div b = a"
    40   by (fact nonzero_mult_divide_cancel_right)
    39   by (fact nonzero_mult_divide_cancel_right)
    41 
    40 
    42 text \<open>@{const divide} and @{const modulo}\<close>
    41 text \<open>@{const divide} and @{const modulo}\<close>
    43 
       
    44 lemma mod_div_equality2: "b * (a div b) + a mod b = a"
       
    45   unfolding mult.commute [of b]
       
    46   by (rule mod_div_equality)
       
    47 
       
    48 lemma mod_div_equality': "a mod b + a div b * b = a"
       
    49   using mod_div_equality [of a b]
       
    50   by (simp only: ac_simps)
       
    51 
    42 
    52 lemma div_mod_equality: "((a div b) * b + a mod b) + c = a + c"
    43 lemma div_mod_equality: "((a div b) * b + a mod b) + c = a + c"
    53   by (simp add: mod_div_equality)
    44   by (simp add: mod_div_equality)
    54 
    45 
    55 lemma div_mod_equality2: "(b * (a div b) + a mod b) + c = a + c"
    46 lemma div_mod_equality2: "(b * (a div b) + a mod b) + c = a + c"
   141 
   132 
   142 lemma mod_add_self2 [simp]:
   133 lemma mod_add_self2 [simp]:
   143   "(a + b) mod b = a mod b"
   134   "(a + b) mod b = a mod b"
   144   using mod_mult_self1 [of a 1 b] by simp
   135   using mod_mult_self1 [of a 1 b] by simp
   145 
   136 
   146 lemma mod_div_decomp:
       
   147   fixes a b
       
   148   obtains q r where "q = a div b" and "r = a mod b"
       
   149     and "a = q * b + r"
       
   150 proof -
       
   151   from mod_div_equality have "a = a div b * b + a mod b" by simp
       
   152   moreover have "a div b = a div b" ..
       
   153   moreover have "a mod b = a mod b" ..
       
   154   note that ultimately show thesis by blast
       
   155 qed
       
   156 
       
   157 lemma dvd_imp_mod_0 [simp]:
   137 lemma dvd_imp_mod_0 [simp]:
   158   assumes "a dvd b"
   138   assumes "a dvd b"
   159   shows "b mod a = 0"
   139   shows "b mod a = 0"
   160 proof -
   140 proof -
   161   from assms obtain c where "b = a * c" ..
   141   from assms obtain c where "b = a * c" ..
   187 next
   167 next
   188   assume "b \<noteq> 0"
   168   assume "b \<noteq> 0"
   189   hence "a div b + a mod b div b = (a mod b + a div b * b) div b"
   169   hence "a div b + a mod b div b = (a mod b + a div b * b) div b"
   190     by (rule div_mult_self1 [symmetric])
   170     by (rule div_mult_self1 [symmetric])
   191   also have "\<dots> = a div b"
   171   also have "\<dots> = a div b"
   192     by (simp only: mod_div_equality')
   172     by (simp only: mod_div_equality3)
   193   also have "\<dots> = a div b + 0"
   173   also have "\<dots> = a div b + 0"
   194     by simp
   174     by simp
   195   finally show ?thesis
   175   finally show ?thesis
   196     by (rule add_left_imp_eq)
   176     by (rule add_left_imp_eq)
   197 qed
   177 qed
   200   "a mod b mod b = a mod b"
   180   "a mod b mod b = a mod b"
   201 proof -
   181 proof -
   202   have "a mod b mod b = (a mod b + a div b * b) mod b"
   182   have "a mod b mod b = (a mod b + a div b * b) mod b"
   203     by (simp only: mod_mult_self1)
   183     by (simp only: mod_mult_self1)
   204   also have "\<dots> = a mod b"
   184   also have "\<dots> = a mod b"
   205     by (simp only: mod_div_equality')
   185     by (simp only: mod_div_equality3)
   206   finally show ?thesis .
   186   finally show ?thesis .
   207 qed
   187 qed
   208 
   188 
   209 lemma dvd_mod_imp_dvd:
   189 lemma dvd_mod_imp_dvd:
   210   assumes "k dvd m mod n" and "k dvd n"
   190   assumes "k dvd m mod n" and "k dvd n"