src/HOL/Library/Rounded_Division.thy
author wenzelm
Mon, 24 Oct 2022 20:37:32 +0200
changeset 76371 1ac2416e8432
parent 76143 e278bf6430cf
child 76247 e19d4c1c48ce
permissions -rw-r--r--
tuned signature (again, amending f32ac01aef5e), e.g. relevant for Isabelle/DOF;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
     1
(*  Author:  Florian Haftmann, TU Muenchen
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
     2
*)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
     3
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
     4
subsection \<open>Rounded division: modulus centered towars zero.\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
     5
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
     6
theory Rounded_Division
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
     7
  imports Main
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
     8
begin
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
     9
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    10
definition rounded_divide :: \<open>int \<Rightarrow> int \<Rightarrow> int\<close>  (infixl \<open>rdiv\<close> 70)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    11
  where \<open>k rdiv l = (k + l div 2 + of_bool (l < 0)) div l\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    12
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    13
definition rounded_modulo :: \<open>int \<Rightarrow> int \<Rightarrow> int\<close>  (infixl \<open>rmod\<close> 70)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    14
  where \<open>k rmod l = k - k rdiv l * l\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    15
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    16
lemma rdiv_mult_rmod_eq:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    17
  \<open>k rdiv l * l + k rmod l = k\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    18
  by (simp add: rounded_divide_def rounded_modulo_def)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    19
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    20
lemma mult_rdiv_rmod_eq:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    21
  \<open>l * (k rdiv l) + k rmod l = k\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    22
  using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    23
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    24
lemma rmod_rdiv_mult_eq:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    25
  \<open>k rmod l + k rdiv l * l = k\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    26
  using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    27
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    28
lemma rmod_mult_rdiv_eq:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    29
  \<open>k rmod l + l * (k rdiv l) = k\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    30
  using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    31
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    32
lemma minus_rdiv_mult_eq_rmod:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    33
  \<open>k - k rdiv l * l = k rmod l\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    34
  by (rule add_implies_diff [symmetric]) (fact rmod_rdiv_mult_eq)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    35
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    36
lemma minus_mult_rdiv_eq_rmod:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    37
  \<open>k - l * (k rdiv l) = k rmod l\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    38
  by (rule add_implies_diff [symmetric]) (fact rmod_mult_rdiv_eq)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    39
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    40
lemma minus_rmod_eq_rdiv_mult:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    41
  \<open>k - k rmod l = k rdiv l * l\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    42
  by (rule add_implies_diff [symmetric]) (fact rdiv_mult_rmod_eq)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    43
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    44
lemma minus_rmod_eq_mult_rdiv:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    45
  \<open>k - k rmod l = l * (k rdiv l)\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    46
  by (rule add_implies_diff [symmetric]) (fact mult_rdiv_rmod_eq)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    47
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    48
lemma rdiv_0_eq [simp]:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    49
  \<open>k rdiv 0 = 0\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    50
  by (simp add: rounded_divide_def)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    51
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    52
lemma rmod_0_eq [simp]:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    53
  \<open>k rmod 0 = k\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    54
  by (simp add: rounded_modulo_def)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    55
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    56
lemma rdiv_1_eq [simp]:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    57
  \<open>k rdiv 1 = k\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    58
  by (simp add: rounded_divide_def)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    59
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    60
lemma rmod_1_eq [simp]:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    61
  \<open>k rmod 1 = 0\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    62
  by (simp add: rounded_modulo_def)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    63
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    64
lemma zero_rdiv_eq [simp]:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    65
  \<open>0 rdiv k = 0\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    66
  by (auto simp add: rounded_divide_def not_less zdiv_eq_0_iff)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    67
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    68
lemma zero_rmod_eq [simp]:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    69
  \<open>0 rmod k = 0\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    70
  by (simp add: rounded_modulo_def)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    71
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    72
lemma nonzero_mult_rdiv_cancel_right:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    73
  \<open>k * l rdiv l = k\<close> if \<open>l \<noteq> 0\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    74
  using that by (auto simp add: rounded_divide_def ac_simps)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    75
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    76
lemma rdiv_self_eq [simp]:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    77
  \<open>k rdiv k = 1\<close> if \<open>k \<noteq> 0\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    78
  using that nonzero_mult_rdiv_cancel_right [of k 1] by simp
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    79
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    80
lemma rmod_self_eq [simp]:
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    81
  \<open>k rmod k = 0\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    82
  by (cases \<open>k = 0\<close>) (simp_all add: rounded_modulo_def)
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    83
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    84
end