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, |