src/HOL/ex/Note_on_signed_division_on_words.thy
author haftmann
Tue, 04 Oct 2022 09:12:42 +0000
changeset 76249 4a064fad28b2
child 77568 13b53fae16f3
permissions -rw-r--r--
note on signed division on words
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
76249
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
     1
theory Note_on_signed_division_on_words
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
     2
  imports "HOL-Library.Word" "HOL-Library.Rounded_Division"
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
     3
begin
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
     4
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
     5
unbundle bit_operations_syntax
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
     6
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
     7
context semiring_bit_operations
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
     8
begin
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
     9
	
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    10
lemma take_bit_Suc_from_most:
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    11
  \<open>take_bit (Suc n) a = 2 ^ n * of_bool (bit a n) OR take_bit n a\<close>
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    12
  by (rule bit_eqI) (auto simp add: bit_simps less_Suc_eq)
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    13
	
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    14
end
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    15
	
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    16
context ring_bit_operations
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    17
begin
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    18
	
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    19
lemma signed_take_bit_exp_eq_int:
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    20
  \<open>signed_take_bit m (2 ^ n) =
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    21
    (if n < m then 2 ^ n else if n = m then - (2 ^ n) else 0)\<close>
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    22
  by (rule bit_eqI) (auto simp add: bit_simps simp flip: mask_eq_exp_minus_1)
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    23
	
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    24
end
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    25
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    26
lift_definition signed_divide_word :: \<open>'a::len word \<Rightarrow> 'a word \<Rightarrow> 'a word\<close>  (infixl \<open>wdiv\<close> 70)
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    27
  is \<open>\<lambda>a b. signed_take_bit (LENGTH('a) - Suc 0) a rdiv signed_take_bit (LENGTH('a) - Suc 0) b\<close>
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    28
  by (simp flip: signed_take_bit_decr_length_iff)
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    29
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    30
lift_definition signed_modulo_word :: \<open>'a::len word \<Rightarrow> 'a word \<Rightarrow> 'a word\<close>  (infixl \<open>wmod\<close> 70)
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    31
  is \<open>\<lambda>a b. signed_take_bit (LENGTH('a) - Suc 0) a rmod signed_take_bit (LENGTH('a) - Suc 0) b\<close>
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    32
  by (simp flip: signed_take_bit_decr_length_iff)
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    33
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    34
lemma signed_take_bit_eq_wmod:
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    35
  \<open>signed_take_bit n w = w wmod (2 ^ Suc n)\<close>
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    36
proof (transfer fixing: n)
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    37
  show \<open>take_bit LENGTH('a) (signed_take_bit n (take_bit LENGTH('a) k)) =
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    38
    take_bit LENGTH('a) (signed_take_bit (LENGTH('a) - Suc 0) k rmod signed_take_bit (LENGTH('a) - Suc 0) (2 ^ Suc n))\<close> for k :: int
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    39
  proof (cases \<open>LENGTH('a) = Suc (Suc n)\<close>)
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    40
    case True
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    41
    then show ?thesis
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    42
      by (simp add: signed_take_bit_exp_eq_int signed_take_bit_take_bit rmod_minus_eq flip: power_Suc signed_take_bit_eq_rmod)
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    43
  next
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    44
    case False
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    45
    then show ?thesis
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    46
      by (auto simp add: signed_take_bit_exp_eq_int signed_take_bit_take_bit take_bit_signed_take_bit simp flip: power_Suc signed_take_bit_eq_rmod)
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    47
  qed
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    48
qed
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    49
  
4a064fad28b2 note on signed division on words
haftmann
parents:
diff changeset
    50
end