src/HOL/Euclidean_Division.thy
changeset 66814 a24cde9588bb
parent 66813 351142796345
child 66816 212a3334e7da
equal deleted inserted replaced
66813:351142796345 66814:a24cde9588bb
   529   obtains 
   529   obtains 
   530     (divides) q where "b \<noteq> 0"
   530     (divides) q where "b \<noteq> 0"
   531       and "a div b = q"
   531       and "a div b = q"
   532       and "a mod b = 0"
   532       and "a mod b = 0"
   533       and "a = q * b"
   533       and "a = q * b"
   534   | (remainder) q r where "b \<noteq> 0" and "r \<noteq> 0"
   534   | (remainder) q r where "b \<noteq> 0"
   535       and "uniqueness_constraint r b"
   535       and "uniqueness_constraint r b"
   536       and "euclidean_size r < euclidean_size b"
   536       and "euclidean_size r < euclidean_size b"
       
   537       and "r \<noteq> 0"
   537       and "a div b = q"
   538       and "a div b = q"
   538       and "a mod b = r"
   539       and "a mod b = r"
   539       and "a = q * b + r"
   540       and "a = q * b + r"
   540   | (by0) "b = 0"
   541   | (by0) "b = 0"
   541 proof (cases "b = 0")
   542 proof (cases "b = 0")
   626       by (simp_all add: uniqueness_constraint_mono_mult uniqueness_constraint_mod size_mono_mult)
   627       by (simp_all add: uniqueness_constraint_mono_mult uniqueness_constraint_mod size_mono_mult)
   627     with remainder show ?thesis
   628     with remainder show ?thesis
   628       by (auto intro!: div_eqI [of _ "c * (a mod b)"] simp add: algebra_simps)
   629       by (auto intro!: div_eqI [of _ "c * (a mod b)"] simp add: algebra_simps)
   629         (use \<open>b * c \<noteq> 0\<close> in simp)
   630         (use \<open>b * c \<noteq> 0\<close> in simp)
   630   qed
   631   qed
       
   632 qed
       
   633 
       
   634 lemma div_mult1_eq:
       
   635   "(a * b) div c = a * (b div c) + a * (b mod c) div c"
       
   636 proof (cases "a * (b mod c)" c rule: divmod_cases)
       
   637   case (divides q)
       
   638   have "a * b = a * (b div c * c + b mod c)"
       
   639     by (simp add: div_mult_mod_eq)
       
   640   also have "\<dots> = (a * (b div c) + q) * c"
       
   641     using divides by (simp add: algebra_simps)
       
   642   finally have "(a * b) div c = \<dots> div c"
       
   643     by simp
       
   644   with divides show ?thesis
       
   645     by simp
       
   646 next
       
   647   case (remainder q r)
       
   648   from remainder(1-3) show ?thesis
       
   649   proof (rule div_eqI)
       
   650     have "a * b = a * (b div c * c + b mod c)"
       
   651       by (simp add: div_mult_mod_eq)
       
   652     also have "\<dots> = a * c * (b div c) + q * c + r"
       
   653       using remainder by (simp add: algebra_simps)
       
   654     finally show "(a * (b div c) + a * (b mod c) div c) * c + r = a * b"
       
   655       using remainder(5-7) by (simp add: algebra_simps)
       
   656   qed
       
   657 next
       
   658   case by0
       
   659   then show ?thesis
       
   660     by simp
       
   661 qed
       
   662 
       
   663 lemma div_add1_eq:
       
   664   "(a + b) div c = a div c + b div c + (a mod c + b mod c) div c"
       
   665 proof (cases "a mod c + b mod c" c rule: divmod_cases)
       
   666   case (divides q)
       
   667   have "a + b = (a div c * c + a mod c) + (b div c * c + b mod c)"
       
   668     using mod_mult_div_eq [of a c] mod_mult_div_eq [of b c] by (simp add: ac_simps)
       
   669   also have "\<dots> = (a div c + b div c) * c + (a mod c + b mod c)"
       
   670     by (simp add: algebra_simps)
       
   671   also have "\<dots> = (a div c + b div c + q) * c"
       
   672     using divides by (simp add: algebra_simps)
       
   673   finally have "(a + b) div c = (a div c + b div c + q) * c div c"
       
   674     by simp
       
   675   with divides show ?thesis
       
   676     by simp
       
   677 next
       
   678   case (remainder q r)
       
   679   from remainder(1-3) show ?thesis
       
   680   proof (rule div_eqI)
       
   681     have "(a div c + b div c + q) * c + r + (a mod c + b mod c) =
       
   682         (a div c * c + a mod c) + (b div c * c + b mod c) + q * c + r"
       
   683       by (simp add: algebra_simps)
       
   684     also have "\<dots> = a + b + (a mod c + b mod c)"
       
   685       by (simp add: div_mult_mod_eq remainder) (simp add: ac_simps)
       
   686     finally show "(a div c + b div c + (a mod c + b mod c) div c) * c + r = a + b"
       
   687       using remainder by simp
       
   688   qed
       
   689 next
       
   690   case by0
       
   691   then show ?thesis
       
   692     by simp
   631 qed
   693 qed
   632 
   694 
   633 end
   695 end
   634 
   696 
   635 class unique_euclidean_ring = euclidean_ring + unique_euclidean_semiring
   697 class unique_euclidean_ring = euclidean_ring + unique_euclidean_semiring
   944   Suc_mod_mult_self1 [simp]: "Suc (m + k * n) mod n = Suc m mod n"
  1006   Suc_mod_mult_self1 [simp]: "Suc (m + k * n) mod n = Suc m mod n"
   945   and Suc_mod_mult_self2 [simp]: "Suc (m + n * k) mod n = Suc m mod n"
  1007   and Suc_mod_mult_self2 [simp]: "Suc (m + n * k) mod n = Suc m mod n"
   946   and Suc_mod_mult_self3 [simp]: "Suc (k * n + m) mod n = Suc m mod n"
  1008   and Suc_mod_mult_self3 [simp]: "Suc (k * n + m) mod n = Suc m mod n"
   947   and Suc_mod_mult_self4 [simp]: "Suc (n * k + m) mod n = Suc m mod n"
  1009   and Suc_mod_mult_self4 [simp]: "Suc (n * k + m) mod n = Suc m mod n"
   948   by (subst mod_Suc_eq [symmetric], simp add: mod_simps)+
  1010   by (subst mod_Suc_eq [symmetric], simp add: mod_simps)+
   949 
       
   950 lemma div_mult1_eq: -- \<open>TODO: Generalization candidate\<close>
       
   951   "(a * b) div c = a * (b div c) + a * (b mod c) div c" for a b c :: nat
       
   952   apply (cases "c = 0")
       
   953    apply simp
       
   954   apply (rule div_eqI [of _ "(a * (b mod c)) mod c"])
       
   955      apply (auto simp add: algebra_simps distrib_left [symmetric])
       
   956   done
       
   957 
       
   958 lemma div_add1_eq: -- \<open>NOT suitable for rewriting: the RHS has an instance of the LHS\<close>
       
   959    -- \<open>TODO: Generalization candidate\<close>
       
   960   "(a + b) div c = a div c + b div c + ((a mod c + b mod c) div c)" for a b c :: nat
       
   961   apply (cases "c = 0")
       
   962    apply simp
       
   963   apply (rule div_eqI [of _ "(a mod c + b mod c) mod c"])
       
   964   apply (auto simp add: algebra_simps)
       
   965   done
       
   966 
  1011 
   967 context
  1012 context
   968   fixes m n q :: nat
  1013   fixes m n q :: nat
   969 begin
  1014 begin
   970 
  1015