1316 assume ?rhs then obtain q1 q2 where q12: "x + n * q1 = y + n * q2" by blast |
1316 assume ?rhs then obtain q1 q2 where q12: "x + n * q1 = y + n * q2" by blast |
1317 hence "(x + n * q1) mod n = (y + n * q2) mod n" by simp |
1317 hence "(x + n * q1) mod n = (y + n * q2) mod n" by simp |
1318 thus ?lhs by simp |
1318 thus ?lhs by simp |
1319 qed |
1319 qed |
1320 |
1320 |
|
1321 lemma div_nat_number_of [simp]: |
|
1322 "(number_of v :: nat) div number_of v' = |
|
1323 (if neg (number_of v :: int) then 0 |
|
1324 else nat (number_of v div number_of v'))" |
|
1325 unfolding nat_number_of_def number_of_is_id neg_def |
|
1326 by (simp add: nat_div_distrib) |
|
1327 |
|
1328 lemma one_div_nat_number_of [simp]: |
|
1329 "Suc 0 div number_of v' = nat (1 div number_of v')" |
|
1330 by (simp del: nat_numeral_1_eq_1 add: numeral_1_eq_Suc_0 [symmetric]) |
|
1331 |
|
1332 lemma mod_nat_number_of [simp]: |
|
1333 "(number_of v :: nat) mod number_of v' = |
|
1334 (if neg (number_of v :: int) then 0 |
|
1335 else if neg (number_of v' :: int) then number_of v |
|
1336 else nat (number_of v mod number_of v'))" |
|
1337 unfolding nat_number_of_def number_of_is_id neg_def |
|
1338 by (simp add: nat_mod_distrib) |
|
1339 |
|
1340 lemma one_mod_nat_number_of [simp]: |
|
1341 "Suc 0 mod number_of v' = |
|
1342 (if neg (number_of v' :: int) then Suc 0 |
|
1343 else nat (1 mod number_of v'))" |
|
1344 by (simp del: nat_numeral_1_eq_1 add: numeral_1_eq_Suc_0 [symmetric]) |
|
1345 |
|
1346 lemmas dvd_eq_mod_eq_0_number_of = |
|
1347 dvd_eq_mod_eq_0 [of "number_of x" "number_of y", standard] |
|
1348 |
|
1349 declare dvd_eq_mod_eq_0_number_of [simp] |
|
1350 |
1321 |
1351 |
1322 subsection {* Code generation *} |
1352 subsection {* Code generation *} |
1323 |
1353 |
1324 definition pdivmod :: "int \<Rightarrow> int \<Rightarrow> int \<times> int" where |
1354 definition pdivmod :: "int \<Rightarrow> int \<Rightarrow> int \<times> int" where |
1325 "pdivmod k l = (\<bar>k\<bar> div \<bar>l\<bar>, \<bar>k\<bar> mod \<bar>l\<bar>)" |
1355 "pdivmod k l = (\<bar>k\<bar> div \<bar>l\<bar>, \<bar>k\<bar> mod \<bar>l\<bar>)" |