# HG changeset patch # User haftmann # Date 1663146900 0 # Node ID e278bf6430cf0d1596eb371b8dd7c42151b554f1 # Parent e8d4013c49d1b9f924de52aab4f4887db3cb3e8f More on division concerning gauss numbers. diff -r e8d4013c49d1 -r e278bf6430cf src/HOL/Examples/Gauss_Numbers.thy --- a/src/HOL/Examples/Gauss_Numbers.thy Tue Sep 13 22:36:41 2022 +0200 +++ b/src/HOL/Examples/Gauss_Numbers.thy Wed Sep 14 09:15:00 2022 +0000 @@ -1,10 +1,10 @@ -(* Author: Florian Haftmann, TU Muenchen; based on existing material on gauss numbers\ +(* Author: Florian Haftmann, TU Muenchen; based on existing material on complex numbers\ *) section \Gauss Numbers: integral gauss numbers\ theory Gauss_Numbers -imports Main + imports "HOL-Library.Rounded_Division" begin codatatype gauss = Gauss (Re: int) (Im: int) @@ -308,8 +308,8 @@ primcorec divide_gauss :: \gauss \ gauss \ gauss\ where - \Re (x div y) = (Re x * Re y + Im x * Im y) div ((Re y)\<^sup>2 + (Im y)\<^sup>2)\ - | \Im (x div y) = (Im x * Re y - Re x * Im y) div ((Re y)\<^sup>2 + (Im y)\<^sup>2)\ + \Re (x div y) = (Re x * Re y + Im x * Im y) rdiv ((Re y)\<^sup>2 + (Im y)\<^sup>2)\ + | \Im (x div y) = (Im x * Re y - Re x * Im y) rdiv ((Re y)\<^sup>2 + (Im y)\<^sup>2)\ definition modulo_gauss :: \gauss \ gauss \ gauss\ where @@ -321,7 +321,7 @@ apply (auto simp add: gauss_eq_iff algebra_simps power2_eq_square) apply (simp_all only: flip: mult.assoc distrib_right) apply (simp_all only: mult.assoc [of \Im k\ \Re l\ \Re r\ for k l r]) - apply (simp_all add: sum_squares_eq_zero_iff mult.commute flip: distrib_left) + apply (simp_all add: sum_squares_eq_zero_iff mult.commute nonzero_mult_rdiv_cancel_right flip: distrib_left) done end diff -r e8d4013c49d1 -r e278bf6430cf src/HOL/Library/Library.thy --- a/src/HOL/Library/Library.thy Tue Sep 13 22:36:41 2022 +0200 +++ b/src/HOL/Library/Library.thy Wed Sep 14 09:15:00 2022 +0000 @@ -79,6 +79,7 @@ Ramsey Reflection Rewrite + Rounded_Division Saturated Set_Algebras Set_Idioms diff -r e8d4013c49d1 -r e278bf6430cf src/HOL/Library/Rounded_Division.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Library/Rounded_Division.thy Wed Sep 14 09:15:00 2022 +0000 @@ -0,0 +1,84 @@ +(* Author: Florian Haftmann, TU Muenchen +*) + +subsection \Rounded division: modulus centered towars zero.\ + +theory Rounded_Division + imports Main +begin + +definition rounded_divide :: \int \ int \ int\ (infixl \rdiv\ 70) + where \k rdiv l = (k + l div 2 + of_bool (l < 0)) div l\ + +definition rounded_modulo :: \int \ int \ int\ (infixl \rmod\ 70) + where \k rmod l = k - k rdiv l * l\ + +lemma rdiv_mult_rmod_eq: + \k rdiv l * l + k rmod l = k\ + by (simp add: rounded_divide_def rounded_modulo_def) + +lemma mult_rdiv_rmod_eq: + \l * (k rdiv l) + k rmod l = k\ + using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps) + +lemma rmod_rdiv_mult_eq: + \k rmod l + k rdiv l * l = k\ + using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps) + +lemma rmod_mult_rdiv_eq: + \k rmod l + l * (k rdiv l) = k\ + using rdiv_mult_rmod_eq [of k l] by (simp add: ac_simps) + +lemma minus_rdiv_mult_eq_rmod: + \k - k rdiv l * l = k rmod l\ + by (rule add_implies_diff [symmetric]) (fact rmod_rdiv_mult_eq) + +lemma minus_mult_rdiv_eq_rmod: + \k - l * (k rdiv l) = k rmod l\ + by (rule add_implies_diff [symmetric]) (fact rmod_mult_rdiv_eq) + +lemma minus_rmod_eq_rdiv_mult: + \k - k rmod l = k rdiv l * l\ + by (rule add_implies_diff [symmetric]) (fact rdiv_mult_rmod_eq) + +lemma minus_rmod_eq_mult_rdiv: + \k - k rmod l = l * (k rdiv l)\ + by (rule add_implies_diff [symmetric]) (fact mult_rdiv_rmod_eq) + +lemma rdiv_0_eq [simp]: + \k rdiv 0 = 0\ + by (simp add: rounded_divide_def) + +lemma rmod_0_eq [simp]: + \k rmod 0 = k\ + by (simp add: rounded_modulo_def) + +lemma rdiv_1_eq [simp]: + \k rdiv 1 = k\ + by (simp add: rounded_divide_def) + +lemma rmod_1_eq [simp]: + \k rmod 1 = 0\ + by (simp add: rounded_modulo_def) + +lemma zero_rdiv_eq [simp]: + \0 rdiv k = 0\ + by (auto simp add: rounded_divide_def not_less zdiv_eq_0_iff) + +lemma zero_rmod_eq [simp]: + \0 rmod k = 0\ + by (simp add: rounded_modulo_def) + +lemma nonzero_mult_rdiv_cancel_right: + \k * l rdiv l = k\ if \l \ 0\ + using that by (auto simp add: rounded_divide_def ac_simps) + +lemma rdiv_self_eq [simp]: + \k rdiv k = 1\ if \k \ 0\ + using that nonzero_mult_rdiv_cancel_right [of k 1] by simp + +lemma rmod_self_eq [simp]: + \k rmod k = 0\ + by (cases \k = 0\) (simp_all add: rounded_modulo_def) + +end