src/HOL/Code_Numeral.thy
changeset 75936 d2e6a1342c90
parent 75883 d7e0b6620c07
child 76053 3310317cc484
equal deleted inserted replaced
75935:06eb4d0031e3 75936:d2e6a1342c90
   376     else \<bar>k mod 2 - l mod 2\<bar> + 2 * ((k div 2) XOR (l div 2)))\<close> for k l :: integer
   376     else \<bar>k mod 2 - l mod 2\<bar> + 2 * ((k div 2) XOR (l div 2)))\<close> for k l :: integer
   377   by transfer (fact xor_int_unfold)
   377   by transfer (fact xor_int_unfold)
   378 
   378 
   379 end
   379 end
   380 
   380 
   381 instantiation integer :: unique_euclidean_semiring_numeral
   381 instantiation integer :: unique_euclidean_semiring_with_nat_division
   382 begin
   382 begin
   383 
   383 
   384 definition divmod_integer :: "num \<Rightarrow> num \<Rightarrow> integer \<times> integer"
   384 definition divmod_integer :: "num \<Rightarrow> num \<Rightarrow> integer \<times> integer"
   385 where
   385 where
   386   divmod_integer'_def: "divmod_integer m n = (numeral m div numeral n, numeral m mod numeral n)"
   386   divmod_integer'_def: "divmod_integer m n = (numeral m div numeral n, numeral m mod numeral n)"
   387 
   387 
   388 definition divmod_step_integer :: "integer \<Rightarrow> integer \<times> integer \<Rightarrow> integer \<times> integer"
   388 definition divmod_step_integer :: "integer \<Rightarrow> integer \<times> integer \<Rightarrow> integer \<times> integer"
   389 where
   389 where
   390   "divmod_step_integer l qr = (let (q, r) = qr
   390   "divmod_step_integer l qr = (let (q, r) = qr
   391     in if r \<ge> l then (2 * q + 1, r - l)
   391     in if \<bar>l\<bar> \<le> \<bar>r\<bar> then (2 * q + 1, r - l)
   392     else (2 * q, r))"
   392     else (2 * q, r))"
   393 
   393 
   394 instance proof
   394 instance by standard
   395   show "divmod m n = (numeral m div numeral n :: integer, numeral m mod numeral n)"
   395   (auto simp add: divmod_integer'_def divmod_step_integer_def integer_less_eq_iff)
   396     for m n by (fact divmod_integer'_def)
       
   397   show "divmod_step l qr = (let (q, r) = qr
       
   398     in if r \<ge> l then (2 * q + 1, r - l)
       
   399     else (2 * q, r))" for l and qr :: "integer \<times> integer"
       
   400     by (fact divmod_step_integer_def)
       
   401 qed (transfer,
       
   402   fact le_add_diff_inverse2
       
   403   unique_euclidean_semiring_numeral_class.div_less
       
   404   unique_euclidean_semiring_numeral_class.mod_less
       
   405   unique_euclidean_semiring_numeral_class.div_positive
       
   406   unique_euclidean_semiring_numeral_class.mod_less_eq_dividend
       
   407   unique_euclidean_semiring_numeral_class.pos_mod_bound
       
   408   unique_euclidean_semiring_numeral_class.pos_mod_sign
       
   409   unique_euclidean_semiring_numeral_class.mod_mult2_eq
       
   410   unique_euclidean_semiring_numeral_class.div_mult2_eq
       
   411   unique_euclidean_semiring_numeral_class.discrete)+
       
   412 
   396 
   413 end
   397 end
   414 
   398 
   415 declare divmod_algorithm_code [where ?'a = integer,
   399 declare divmod_algorithm_code [where ?'a = integer,
   416   folded integer_of_num_def, unfolded integer_of_num_triv,
   400   folded integer_of_num_def, unfolded integer_of_num_triv,