equal
deleted
inserted
replaced
17 assumes mod_size_less: |
17 assumes mod_size_less: |
18 "b \<noteq> 0 \<Longrightarrow> euclidean_size (a mod b) < euclidean_size b" |
18 "b \<noteq> 0 \<Longrightarrow> euclidean_size (a mod b) < euclidean_size b" |
19 assumes size_mult_mono: |
19 assumes size_mult_mono: |
20 "b \<noteq> 0 \<Longrightarrow> euclidean_size a \<le> euclidean_size (a * b)" |
20 "b \<noteq> 0 \<Longrightarrow> euclidean_size a \<le> euclidean_size (a * b)" |
21 begin |
21 begin |
|
22 |
|
23 lemma euclidean_size_eq_0_iff [simp]: |
|
24 "euclidean_size b = 0 \<longleftrightarrow> b = 0" |
|
25 proof |
|
26 assume "b = 0" |
|
27 then show "euclidean_size b = 0" |
|
28 by simp |
|
29 next |
|
30 assume "euclidean_size b = 0" |
|
31 show "b = 0" |
|
32 proof (rule ccontr) |
|
33 assume "b \<noteq> 0" |
|
34 with mod_size_less have "euclidean_size (b mod b) < euclidean_size b" . |
|
35 with \<open>euclidean_size b = 0\<close> show False |
|
36 by simp |
|
37 qed |
|
38 qed |
|
39 |
|
40 lemma euclidean_size_greater_0_iff [simp]: |
|
41 "euclidean_size b > 0 \<longleftrightarrow> b \<noteq> 0" |
|
42 using euclidean_size_eq_0_iff [symmetric, of b] by safe simp |
22 |
43 |
23 lemma size_mult_mono': "b \<noteq> 0 \<Longrightarrow> euclidean_size a \<le> euclidean_size (b * a)" |
44 lemma size_mult_mono': "b \<noteq> 0 \<Longrightarrow> euclidean_size a \<le> euclidean_size (b * a)" |
24 by (subst mult.commute) (rule size_mult_mono) |
45 by (subst mult.commute) (rule size_mult_mono) |
25 |
46 |
26 lemma dvd_euclidean_size_eq_imp_dvd: |
47 lemma dvd_euclidean_size_eq_imp_dvd: |
106 |
127 |
107 end |
128 end |
108 |
129 |
109 class euclidean_ring = idom_modulo + euclidean_semiring |
130 class euclidean_ring = idom_modulo + euclidean_semiring |
110 |
131 |
111 |
132 |
112 subsection \<open>Euclidean (semi)rings with cancel rules\<close> |
133 subsection \<open>Euclidean (semi)rings with cancel rules\<close> |
113 |
134 |
114 class euclidean_semiring_cancel = euclidean_semiring + |
135 class euclidean_semiring_cancel = euclidean_semiring + |
115 assumes div_mult_self1 [simp]: "b \<noteq> 0 \<Longrightarrow> (a + c * b) div b = c + a div b" |
136 assumes div_mult_self1 [simp]: "b \<noteq> 0 \<Longrightarrow> (a + c * b) div b = c + a div b" |
116 and div_mult_mult1 [simp]: "c \<noteq> 0 \<Longrightarrow> (c * a) div (c * b) = a div b" |
137 and div_mult_mult1 [simp]: "c \<noteq> 0 \<Longrightarrow> (c * a) div (c * b) = a div b" |
504 |
525 |
505 |
526 |
506 subsection \<open>Uniquely determined division\<close> |
527 subsection \<open>Uniquely determined division\<close> |
507 |
528 |
508 class unique_euclidean_semiring = euclidean_semiring + |
529 class unique_euclidean_semiring = euclidean_semiring + |
509 assumes size_mono_mult: |
530 assumes euclidean_size_mult: "euclidean_size (a * b) = euclidean_size a * euclidean_size b" |
510 "b \<noteq> 0 \<Longrightarrow> euclidean_size a < euclidean_size c |
|
511 \<Longrightarrow> euclidean_size (a * b) < euclidean_size (c * b)" |
|
512 -- \<open>FIXME justify\<close> |
|
513 fixes division_segment :: "'a \<Rightarrow> 'a" |
531 fixes division_segment :: "'a \<Rightarrow> 'a" |
514 assumes is_unit_division_segment [simp]: "is_unit (division_segment a)" |
532 assumes is_unit_division_segment [simp]: "is_unit (division_segment a)" |
515 and division_segment_mult: |
533 and division_segment_mult: |
516 "a \<noteq> 0 \<Longrightarrow> b \<noteq> 0 \<Longrightarrow> division_segment (a * b) = division_segment a * division_segment b" |
534 "a \<noteq> 0 \<Longrightarrow> b \<noteq> 0 \<Longrightarrow> division_segment (a * b) = division_segment a * division_segment b" |
517 and division_segment_mod: |
535 and division_segment_mod: |
623 from \<open>b \<noteq> 0\<close> \<open>c \<noteq> 0\<close> have "b * c \<noteq> 0" |
641 from \<open>b \<noteq> 0\<close> \<open>c \<noteq> 0\<close> have "b * c \<noteq> 0" |
624 by simp |
642 by simp |
625 from remainder \<open>c \<noteq> 0\<close> |
643 from remainder \<open>c \<noteq> 0\<close> |
626 have "division_segment (r * c) = division_segment (b * c)" |
644 have "division_segment (r * c) = division_segment (b * c)" |
627 and "euclidean_size (r * c) < euclidean_size (b * c)" |
645 and "euclidean_size (r * c) < euclidean_size (b * c)" |
628 by (simp_all add: division_segment_mult division_segment_mod size_mono_mult) |
646 by (simp_all add: division_segment_mult division_segment_mod euclidean_size_mult) |
629 with remainder show ?thesis |
647 with remainder show ?thesis |
630 by (auto intro!: div_eqI [of _ "c * (a mod b)"] simp add: algebra_simps) |
648 by (auto intro!: div_eqI [of _ "c * (a mod b)"] simp add: algebra_simps) |
631 (use \<open>b * c \<noteq> 0\<close> in simp) |
649 (use \<open>b * c \<noteq> 0\<close> in simp) |
632 qed |
650 qed |
633 qed |
651 qed |