src/HOL/Library/Centered_Division.thy
author haftmann
Fri, 27 Jun 2025 08:09:26 +0200
changeset 82775 61c39a9e5415
parent 79950 82aaa0d8fc3b
permissions -rw-r--r--
typo
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
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
     4
section \<open>Division with modulus centered towards zero.\<close>
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
     5
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
     6
theory Centered_Division
76143
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
76251
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
    10
lemma off_iff_abs_mod_2_eq_one:
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
    11
  \<open>odd l \<longleftrightarrow> \<bar>l\<bar> mod 2 = 1\<close> for l :: int
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
    12
  by (simp flip: odd_iff_mod_2_eq_one)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
    13
77812
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    14
text \<open>
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    15
  \noindent The following specification of division on integers centers
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    16
  the modulus around zero.  This is useful e.g.~to define division
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    17
  on Gauss numbers.
79950
82aaa0d8fc3b isabelle update -u cite;
wenzelm
parents: 77884
diff changeset
    18
  N.b.: This is not mentioned \<^cite>\<open>"leijen01"\<close>.
77812
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    19
\<close>
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    20
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    21
definition centered_divide :: \<open>int \<Rightarrow> int \<Rightarrow> int\<close>  (infixl \<open>cdiv\<close> 70)
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    22
  where \<open>k cdiv l = sgn l * ((k + \<bar>l\<bar> div 2) div \<bar>l\<bar>)\<close>
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    23
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    24
definition centered_modulo :: \<open>int \<Rightarrow> int \<Rightarrow> int\<close>  (infixl \<open>cmod\<close> 70)
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    25
  where \<open>k cmod l = (k + \<bar>l\<bar> div 2) mod \<bar>l\<bar> - \<bar>l\<bar> div 2\<close>
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    26
77812
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    27
text \<open>
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    28
  \noindent Example: @{lemma \<open>k cmod 5 \<in> {-2, -1, 0, 1, 2}\<close> by (auto simp add: centered_modulo_def)}
77812
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    29
\<close>
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    30
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    31
lemma signed_take_bit_eq_cmod:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    32
  \<open>signed_take_bit n k = k cmod (2 ^ Suc n)\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    33
  by (simp only: centered_modulo_def power_abs abs_numeral flip: take_bit_eq_mod)
77812
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    34
    (simp add: signed_take_bit_eq_take_bit_shift)
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    35
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    36
text \<open>
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    37
  \noindent Property @{thm signed_take_bit_eq_cmod [no_vars]} is the key to generalize
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    38
  centered division to arbitrary structures satisfying \<^class>\<open>ring_bit_operations\<close>,
77812
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    39
  but so far it is not clear what practical relevance that would have.
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    40
\<close>
fb3d81bd9803 some remarks on division
haftmann
parents: 77811
diff changeset
    41
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    42
lemma cdiv_mult_cmod_eq:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    43
  \<open>k cdiv l * l + k cmod l = k\<close>
76248
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
    44
proof -
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
    45
  have *: \<open>l * (sgn l * j) = \<bar>l\<bar> * j\<close> for j
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
    46
    by (simp add: ac_simps abs_sgn)
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
    47
  show ?thesis
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    48
    by (simp add: centered_divide_def centered_modulo_def algebra_simps *)
76248
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
    49
qed
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    50
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    51
lemma mult_cdiv_cmod_eq:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    52
  \<open>l * (k cdiv l) + k cmod l = k\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    53
  using cdiv_mult_cmod_eq [of k l] by (simp add: ac_simps)
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    54
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    55
lemma cmod_cdiv_mult_eq:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    56
  \<open>k cmod l + k cdiv l * l = k\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    57
  using cdiv_mult_cmod_eq [of k l] by (simp add: ac_simps)
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    58
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    59
lemma cmod_mult_cdiv_eq:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    60
  \<open>k cmod l + l * (k cdiv l) = k\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    61
  using cdiv_mult_cmod_eq [of k l] by (simp add: ac_simps)
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    62
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    63
lemma minus_cdiv_mult_eq_cmod:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    64
  \<open>k - k cdiv l * l = k cmod l\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    65
  by (rule add_implies_diff [symmetric]) (fact cmod_cdiv_mult_eq)
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    66
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    67
lemma minus_mult_cdiv_eq_cmod:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    68
  \<open>k - l * (k cdiv l) = k cmod l\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    69
  by (rule add_implies_diff [symmetric]) (fact cmod_mult_cdiv_eq)
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    70
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    71
lemma minus_cmod_eq_cdiv_mult:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    72
  \<open>k - k cmod l = k cdiv l * l\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    73
  by (rule add_implies_diff [symmetric]) (fact cdiv_mult_cmod_eq)
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    74
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    75
lemma minus_cmod_eq_mult_cdiv:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    76
  \<open>k - k cmod l = l * (k cdiv l)\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    77
  by (rule add_implies_diff [symmetric]) (fact mult_cdiv_cmod_eq)
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    78
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    79
lemma cdiv_0_eq [simp]:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    80
  \<open>k cdiv 0 = 0\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    81
  by (simp add: centered_divide_def)
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    82
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    83
lemma cmod_0_eq [simp]:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    84
  \<open>k cmod 0 = k\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    85
  by (simp add: centered_modulo_def)
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    86
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    87
lemma cdiv_1_eq [simp]:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    88
  \<open>k cdiv 1 = k\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    89
  by (simp add: centered_divide_def)
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    90
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    91
lemma cmod_1_eq [simp]:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    92
  \<open>k cmod 1 = 0\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    93
  by (simp add: centered_modulo_def)
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    94
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    95
lemma zero_cdiv_eq [simp]:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    96
  \<open>0 cdiv k = 0\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    97
  by (auto simp add: centered_divide_def not_less zdiv_eq_0_iff)
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
    98
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
    99
lemma zero_cmod_eq [simp]:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   100
  \<open>0 cmod k = 0\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   101
  by (auto simp add: centered_modulo_def not_less zmod_trivial_iff)
76248
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   102
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   103
lemma cdiv_minus_eq:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   104
  \<open>k cdiv - l = - (k cdiv l)\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   105
  by (simp add: centered_divide_def)
76248
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   106
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   107
lemma cmod_minus_eq [simp]:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   108
  \<open>k cmod - l = k cmod l\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   109
  by (simp add: centered_modulo_def)
76248
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   110
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   111
lemma cdiv_abs_eq:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   112
  \<open>k cdiv \<bar>l\<bar> = sgn l * (k cdiv l)\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   113
  by (simp add: centered_divide_def)
76248
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   114
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   115
lemma cmod_abs_eq [simp]:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   116
  \<open>k cmod \<bar>l\<bar> = k cmod l\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   117
  by (simp add: centered_modulo_def)
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
   118
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   119
lemma nonzero_mult_cdiv_cancel_right:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   120
  \<open>k * l cdiv l = k\<close> if \<open>l \<noteq> 0\<close>
76248
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   121
proof -
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   122
  have \<open>sgn l * k * \<bar>l\<bar> cdiv l = k\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   123
    using that by (simp add: centered_divide_def)
76248
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   124
  with that show ?thesis
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   125
    by (simp add: ac_simps abs_sgn)
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   126
qed
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
   127
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   128
lemma cdiv_self_eq [simp]:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   129
  \<open>k cdiv k = 1\<close> if \<open>k \<noteq> 0\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   130
  using that nonzero_mult_cdiv_cancel_right [of k 1] by simp
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
   131
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   132
lemma cmod_self_eq [simp]:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   133
  \<open>k cmod k = 0\<close>
76248
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   134
proof -
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   135
  have \<open>(sgn k * \<bar>k\<bar> + \<bar>k\<bar> div 2) mod \<bar>k\<bar> = \<bar>k\<bar> div 2\<close>
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   136
    by (auto simp add: zmod_trivial_iff)
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   137
  also have \<open>sgn k * \<bar>k\<bar> = k\<close>
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   138
    by (simp add: abs_sgn)
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   139
  finally show ?thesis
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   140
    by (simp add: centered_modulo_def algebra_simps)
76248
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   141
qed
da4e57d30579 tuned definition
haftmann
parents: 76247
diff changeset
   142
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   143
lemma cmod_less_divisor:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   144
  \<open>k cmod l < \<bar>l\<bar> - \<bar>l\<bar> div 2\<close> if \<open>l \<noteq> 0\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   145
  using that pos_mod_bound [of \<open>\<bar>l\<bar>\<close>] by (simp add: centered_modulo_def)
76251
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   146
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   147
lemma cmod_less_equal_divisor:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   148
  \<open>k cmod l \<le> \<bar>l\<bar> div 2\<close> if \<open>l \<noteq> 0\<close>
76251
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   149
proof -
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   150
  from that cmod_less_divisor [of l k]
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   151
  have \<open>k cmod l < \<bar>l\<bar> - \<bar>l\<bar> div 2\<close>
76251
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   152
    by simp
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   153
  also have \<open>\<bar>l\<bar> - \<bar>l\<bar> div 2 = \<bar>l\<bar> div 2 + of_bool (odd l)\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   154
    by auto
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   155
  finally show ?thesis
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   156
    by (cases \<open>even l\<close>) simp_all
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   157
qed
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   158
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   159
lemma divisor_less_equal_cmod':
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   160
  \<open>\<bar>l\<bar> div 2 - \<bar>l\<bar> \<le> k cmod l\<close> if \<open>l \<noteq> 0\<close>
76251
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   161
proof -
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   162
  have \<open>0 \<le> (k + \<bar>l\<bar> div 2) mod \<bar>l\<bar>\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   163
    using that pos_mod_sign [of \<open>\<bar>l\<bar>\<close>] by simp
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   164
  then show ?thesis
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   165
    by (simp_all add: centered_modulo_def)
76251
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   166
qed
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   167
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   168
lemma divisor_less_equal_cmod:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   169
  \<open>- (\<bar>l\<bar> div 2) \<le> k cmod l\<close> if \<open>l \<noteq> 0\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   170
  using that divisor_less_equal_cmod' [of l k]
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   171
  by (simp add: centered_modulo_def)
76251
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   172
77884
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   173
lemma abs_cmod_less_equal:
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   174
  \<open>\<bar>k cmod l\<bar> \<le> \<bar>l\<bar> div 2\<close> if \<open>l \<noteq> 0\<close>
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   175
  using that divisor_less_equal_cmod [of l k]
0e054e6e7f5e clarified terminology
haftmann
parents: 77812
diff changeset
   176
  by (simp add: abs_le_iff cmod_less_equal_divisor)
76251
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76248
diff changeset
   177
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents:
diff changeset
   178
end