src/HOL/Examples/Gauss_Numbers.thy
author haftmann
Thu, 06 Oct 2022 14:16:39 +0000
changeset 76251 fbde7d1211fc
parent 76250 63bcec915790
child 77884 0e054e6e7f5e
permissions -rw-r--r--
euclidean division on gaussian numbers
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents: 75955
diff changeset
     1
(*   Author:      Florian Haftmann, TU Muenchen; based on existing material on complex numbers\<close>
75955
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
     2
*)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
     3
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
     4
section \<open>Gauss Numbers: integral gauss numbers\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
     5
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
     6
theory Gauss_Numbers
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents: 75955
diff changeset
     7
  imports "HOL-Library.Rounded_Division"
75955
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
     8
begin
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
     9
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    10
codatatype gauss = Gauss (Re: int) (Im: int)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    11
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    12
lemma gauss_eqI [intro?]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    13
  \<open>x = y\<close> if \<open>Re x = Re y\<close> \<open>Im x = Im y\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    14
  by (rule gauss.expand) (use that in simp)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    15
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    16
lemma gauss_eq_iff:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    17
  \<open>x = y \<longleftrightarrow> Re x = Re y \<and> Im x = Im y\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    18
  by (auto intro: gauss_eqI)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    19
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    20
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    21
subsection \<open>Basic arithmetic\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    22
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    23
instantiation gauss :: comm_ring_1
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    24
begin
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    25
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    26
primcorec zero_gauss :: \<open>gauss\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    27
  where
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    28
    \<open>Re 0 = 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    29
  | \<open>Im 0 = 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    30
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    31
primcorec one_gauss :: \<open>gauss\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    32
  where
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    33
    \<open>Re 1 = 1\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    34
  | \<open>Im 1 = 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    35
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    36
primcorec plus_gauss :: \<open>gauss \<Rightarrow> gauss \<Rightarrow> gauss\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    37
  where
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    38
    \<open>Re (x + y) = Re x + Re y\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    39
  | \<open>Im (x + y) = Im x + Im y\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    40
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    41
primcorec uminus_gauss :: \<open>gauss \<Rightarrow> gauss\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    42
  where
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    43
    \<open>Re (- x) = - Re x\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    44
  | \<open>Im (- x) = - Im x\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    45
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    46
primcorec minus_gauss :: \<open>gauss \<Rightarrow> gauss \<Rightarrow> gauss\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    47
  where
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    48
    \<open>Re (x - y) = Re x - Re y\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    49
  | \<open>Im (x - y) = Im x - Im y\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    50
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    51
primcorec times_gauss :: \<open>gauss \<Rightarrow> gauss \<Rightarrow> gauss\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    52
  where
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    53
    \<open>Re (x * y) = Re x * Re y - Im x * Im y\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    54
  | \<open>Im (x * y) = Re x * Im y + Im x * Re y\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    55
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    56
instance
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    57
  by standard (simp_all add: gauss_eq_iff algebra_simps)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    58
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    59
end
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    60
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    61
lemma of_nat_gauss:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    62
  \<open>of_nat n = Gauss (int n) 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    63
  by (induction n) (simp_all add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    64
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    65
lemma numeral_gauss:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    66
  \<open>numeral n = Gauss (numeral n) 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    67
proof -
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    68
  have \<open>numeral n = (of_nat (numeral n) :: gauss)\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    69
    by simp
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    70
  also have \<open>\<dots> = Gauss (of_nat (numeral n)) 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    71
    by (simp add: of_nat_gauss)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    72
  finally show ?thesis
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    73
    by simp
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    74
qed
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    75
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    76
lemma of_int_gauss:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    77
  \<open>of_int k = Gauss k 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    78
  by (simp add: gauss_eq_iff of_int_of_nat of_nat_gauss)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    79
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    80
lemma conversion_simps [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    81
  \<open>Re (numeral m) = numeral m\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    82
  \<open>Im (numeral m) = 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    83
  \<open>Re (of_nat n) = int n\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    84
  \<open>Im (of_nat n) = 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    85
  \<open>Re (of_int k) = k\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    86
  \<open>Im (of_int k) = 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    87
  by (simp_all add: numeral_gauss of_nat_gauss of_int_gauss)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    88
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    89
lemma gauss_eq_0:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    90
  \<open>z = 0 \<longleftrightarrow> (Re z)\<^sup>2 + (Im z)\<^sup>2 = 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    91
  by (simp add: gauss_eq_iff sum_power2_eq_zero_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    92
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    93
lemma gauss_neq_0:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    94
  \<open>z \<noteq> 0 \<longleftrightarrow> (Re z)\<^sup>2 + (Im z)\<^sup>2 > 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    95
  by (simp add: gauss_eq_0 sum_power2_ge_zero less_le)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    96
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    97
lemma Re_sum [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    98
  \<open>Re (sum f s) = (\<Sum>x\<in>s. Re (f x))\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
    99
  by (induct s rule: infinite_finite_induct) auto
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   100
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   101
lemma Im_sum [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   102
  \<open>Im (sum f s) = (\<Sum>x\<in>s. Im (f x))\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   103
  by (induct s rule: infinite_finite_induct) auto
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   104
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   105
instance gauss :: idom
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   106
proof
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   107
  fix x y :: gauss
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   108
  assume \<open>x \<noteq> 0\<close> \<open>y \<noteq> 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   109
  then show \<open>x * y \<noteq> 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   110
    by (simp_all add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   111
      (smt (verit, best) mult_eq_0_iff mult_neg_neg mult_neg_pos mult_pos_neg mult_pos_pos)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   112
qed
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   113
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   114
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   115
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   116
subsection \<open>The Gauss Number $i$\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   117
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   118
primcorec imaginary_unit :: gauss  (\<open>\<i>\<close>)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   119
  where
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   120
    \<open>Re \<i> = 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   121
  | \<open>Im \<i> = 1\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   122
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   123
lemma Gauss_eq:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   124
  \<open>Gauss a b = of_int a + \<i> * of_int b\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   125
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   126
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   127
lemma gauss_eq:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   128
  \<open>a = of_int (Re a) + \<i> * of_int (Im a)\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   129
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   130
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   131
lemma gauss_i_not_zero [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   132
  \<open>\<i> \<noteq> 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   133
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   134
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   135
lemma gauss_i_not_one [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   136
  \<open>\<i> \<noteq> 1\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   137
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   138
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   139
lemma gauss_i_not_numeral [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   140
  \<open>\<i> \<noteq> numeral n\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   141
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   142
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   143
lemma gauss_i_not_neg_numeral [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   144
  \<open>\<i> \<noteq> - numeral n\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   145
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   146
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   147
lemma i_mult_i_eq [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   148
  \<open>\<i> * \<i> = - 1\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   149
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   150
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   151
lemma gauss_i_mult_minus [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   152
  \<open>\<i> * (\<i> * x) = - x\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   153
  by (simp flip: mult.assoc)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   154
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   155
lemma i_squared [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   156
  \<open>\<i>\<^sup>2 = - 1\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   157
  by (simp add: power2_eq_square)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   158
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   159
lemma i_even_power [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   160
  \<open>\<i> ^ (n * 2) = (- 1) ^ n\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   161
  unfolding mult.commute [of n] power_mult by simp
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   162
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   163
lemma Re_i_times [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   164
  \<open>Re (\<i> * z) = - Im z\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   165
  by simp
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   166
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   167
lemma Im_i_times [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   168
  \<open>Im (\<i> * z) = Re z\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   169
  by simp
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   170
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   171
lemma i_times_eq_iff:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   172
  \<open>\<i> * w = z \<longleftrightarrow> w = - (\<i> * z)\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   173
  by auto
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   174
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   175
lemma is_unit_i [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   176
  \<open>\<i> dvd 1\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   177
  by (rule dvdI [of _ _ \<open>- \<i>\<close>]) simp
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   178
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   179
lemma gauss_numeral [code_post]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   180
  \<open>Gauss 0 0 = 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   181
  \<open>Gauss 1 0 = 1\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   182
  \<open>Gauss (- 1) 0 = - 1\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   183
  \<open>Gauss (numeral n) 0 = numeral n\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   184
  \<open>Gauss (- numeral n) 0 = - numeral n\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   185
  \<open>Gauss 0 1 = \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   186
  \<open>Gauss 0 (- 1) = - \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   187
  \<open>Gauss 0 (numeral n) = numeral n * \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   188
  \<open>Gauss 0 (- numeral n) = - numeral n * \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   189
  \<open>Gauss 1 1 = 1 + \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   190
  \<open>Gauss (- 1) 1 = - 1 + \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   191
  \<open>Gauss (numeral n) 1 = numeral n + \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   192
  \<open>Gauss (- numeral n) 1 = - numeral n + \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   193
  \<open>Gauss 1 (- 1) = 1 - \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   194
  \<open>Gauss 1 (numeral n) = 1 + numeral n * \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   195
  \<open>Gauss 1 (- numeral n) = 1 - numeral n * \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   196
  \<open>Gauss (- 1) (- 1) = - 1 - \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   197
  \<open>Gauss (numeral n) (- 1) = numeral n - \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   198
  \<open>Gauss (- numeral n) (- 1) = - numeral n - \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   199
  \<open>Gauss (- 1) (numeral n) = - 1 + numeral n * \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   200
  \<open>Gauss (- 1) (- numeral n) = - 1 - numeral n * \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   201
  \<open>Gauss (numeral m) (numeral n) = numeral m + numeral n * \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   202
  \<open>Gauss (- numeral m) (numeral n) = - numeral m + numeral n * \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   203
  \<open>Gauss (numeral m) (- numeral n) = numeral m - numeral n * \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   204
  \<open>Gauss (- numeral m) (- numeral n) = - numeral m - numeral n * \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   205
  by (simp_all add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   206
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   207
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   208
subsection \<open>Gauss Conjugation\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   209
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   210
primcorec cnj :: \<open>gauss \<Rightarrow> gauss\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   211
  where
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   212
    \<open>Re (cnj z) = Re z\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   213
  | \<open>Im (cnj z) = - Im z\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   214
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   215
lemma gauss_cnj_cancel_iff [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   216
  \<open>cnj x = cnj y \<longleftrightarrow> x = y\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   217
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   218
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   219
lemma gauss_cnj_cnj [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   220
  \<open>cnj (cnj z) = z\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   221
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   222
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   223
lemma gauss_cnj_zero [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   224
  \<open>cnj 0 = 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   225
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   226
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   227
lemma gauss_cnj_zero_iff [iff]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   228
  \<open>cnj z = 0 \<longleftrightarrow> z = 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   229
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   230
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   231
lemma gauss_cnj_one_iff [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   232
  \<open>cnj z = 1 \<longleftrightarrow> z = 1\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   233
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   234
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   235
lemma gauss_cnj_add [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   236
  \<open>cnj (x + y) = cnj x + cnj y\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   237
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   238
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   239
lemma cnj_sum [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   240
  \<open>cnj (sum f s) = (\<Sum>x\<in>s. cnj (f x))\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   241
  by (induct s rule: infinite_finite_induct) auto
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   242
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   243
lemma gauss_cnj_diff [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   244
  \<open>cnj (x - y) = cnj x - cnj y\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   245
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   246
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   247
lemma gauss_cnj_minus [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   248
  \<open>cnj (- x) = - cnj x\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   249
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   250
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   251
lemma gauss_cnj_one [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   252
  \<open>cnj 1 = 1\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   253
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   254
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   255
lemma gauss_cnj_mult [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   256
  \<open>cnj (x * y) = cnj x * cnj y\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   257
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   258
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   259
lemma cnj_prod [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   260
  \<open>cnj (prod f s) = (\<Prod>x\<in>s. cnj (f x))\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   261
  by (induct s rule: infinite_finite_induct) auto
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   262
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   263
lemma gauss_cnj_power [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   264
  \<open>cnj (x ^ n) = cnj x ^ n\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   265
  by (induct n) simp_all
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   266
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   267
lemma gauss_cnj_numeral [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   268
  \<open>cnj (numeral w) = numeral w\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   269
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   270
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   271
lemma gauss_cnj_of_nat [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   272
  \<open>cnj (of_nat n) = of_nat n\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   273
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   274
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   275
lemma gauss_cnj_of_int [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   276
  \<open>cnj (of_int z) = of_int z\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   277
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   278
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   279
lemma gauss_cnj_i [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   280
  \<open>cnj \<i> = - \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   281
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   282
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   283
lemma gauss_add_cnj:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   284
  \<open>z + cnj z = of_int (2 * Re z)\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   285
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   286
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   287
lemma gauss_diff_cnj:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   288
  \<open>z - cnj z = of_int (2 * Im z) * \<i>\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   289
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   290
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   291
lemma gauss_mult_cnj:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   292
  \<open>z * cnj z = of_int ((Re z)\<^sup>2 + (Im z)\<^sup>2)\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   293
  by (simp add: gauss_eq_iff power2_eq_square)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   294
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   295
lemma cnj_add_mult_eq_Re:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   296
  \<open>z * cnj w + cnj z * w = of_int (2 * Re (z * cnj w))\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   297
  by (simp add: gauss_eq_iff)
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   298
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   299
lemma gauss_In_mult_cnj_zero [simp]:
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   300
  \<open>Im (z * cnj z) = 0\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   301
  by simp
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   302
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   303
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   304
subsection \<open>Algebraic division\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   305
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   306
instantiation gauss :: idom_modulo
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   307
begin
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   308
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   309
primcorec divide_gauss :: \<open>gauss \<Rightarrow> gauss \<Rightarrow> gauss\<close>
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   310
  where
76143
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents: 75955
diff changeset
   311
    \<open>Re (x div y) = (Re x * Re y + Im x * Im y) rdiv ((Re y)\<^sup>2 + (Im y)\<^sup>2)\<close>
e278bf6430cf More on division concerning gauss numbers.
haftmann
parents: 75955
diff changeset
   312
  | \<open>Im (x div y) = (Im x * Re y - Re x * Im y) rdiv ((Re y)\<^sup>2 + (Im y)\<^sup>2)\<close>
75955
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   313
76250
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   314
primcorec modulo_gauss :: \<open>gauss \<Rightarrow> gauss \<Rightarrow> gauss\<close>
75955
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   315
  where
76250
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   316
    \<open>Re (x mod y) = Re x -
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   317
      ((Re x * Re y + Im x * Im y) rdiv ((Re y)\<^sup>2 + (Im y)\<^sup>2) * Re y -
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   318
       (Im x * Re y - Re x * Im y) rdiv ((Re y)\<^sup>2 + (Im y)\<^sup>2) * Im y)\<close>
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   319
  | \<open>Im (x mod y) = Im x -
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   320
      ((Re x * Re y + Im x * Im y) rdiv ((Re y)\<^sup>2 + (Im y)\<^sup>2) * Im y +
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   321
       (Im x * Re y - Re x * Im y) rdiv ((Re y)\<^sup>2 + (Im y)\<^sup>2) * Re y)\<close>
75955
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   322
76250
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   323
instance proof
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   324
  fix x y :: gauss
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   325
  show \<open>x div 0 = 0\<close>
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   326
    by (simp add: gauss_eq_iff)
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   327
  show \<open>x * y div y = x\<close> if \<open>y \<noteq> 0\<close>
76251
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   328
  proof -
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   329
    define Y where \<open>Y = (Re y)\<^sup>2 + (Im y)\<^sup>2\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   330
    moreover have \<open>Y > 0\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   331
      using that by (simp add: gauss_eq_0 less_le Y_def)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   332
    have *: \<open>Im y * (Im y * Re x) + Re x * (Re y * Re y) = Re x * Y\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   333
      \<open>Im x * (Im y * Im y) + Im x * (Re y * Re y) = Im x * Y\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   334
      \<open>(Im y)\<^sup>2 + (Re y)\<^sup>2 = Y\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   335
      by (simp_all add: power2_eq_square algebra_simps Y_def)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   336
    from \<open>Y > 0\<close> show ?thesis
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   337
      by (simp add: gauss_eq_iff algebra_simps) (simp add: * nonzero_mult_rdiv_cancel_right)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   338
  qed
76250
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   339
  show \<open>x div y * y + x mod y = x\<close>
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   340
    by (simp add: gauss_eq_iff)
63bcec915790 tuned proof
haftmann
parents: 76143
diff changeset
   341
qed
75955
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   342
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   343
end
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   344
76251
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   345
instantiation gauss :: euclidean_ring
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   346
begin
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   347
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   348
definition euclidean_size_gauss :: \<open>gauss \<Rightarrow> nat\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   349
  where \<open>euclidean_size x = nat ((Re x)\<^sup>2 + (Im x)\<^sup>2)\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   350
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   351
instance proof
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   352
  show \<open>euclidean_size (0::gauss) = 0\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   353
    by (simp add: euclidean_size_gauss_def)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   354
  show \<open>euclidean_size (x mod y) < euclidean_size y\<close> if \<open>y \<noteq> 0\<close> for x y :: gauss
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   355
  proof-
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   356
    define X and Y and R and I
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   357
      where \<open>X = (Re x)\<^sup>2 + (Im x)\<^sup>2\<close> and \<open>Y = (Re y)\<^sup>2 + (Im y)\<^sup>2\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   358
        and \<open>R = Re x * Re y + Im x * Im y\<close> and \<open>I = Im x * Re y - Re x * Im y\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   359
    with that have \<open>0 < Y\<close> and rhs: \<open>int (euclidean_size y) = Y\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   360
      by (simp_all add: gauss_neq_0 euclidean_size_gauss_def)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   361
    have \<open>X * Y = R\<^sup>2 + I\<^sup>2\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   362
      by (simp add: R_def I_def X_def Y_def power2_eq_square algebra_simps)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   363
    let ?lhs = \<open>X - I * (I rdiv Y) - R * (R rdiv Y)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   364
        - I rdiv Y * (I rmod Y) - R rdiv Y * (R rmod Y)\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   365
    have \<open>?lhs = X + Y * (R rdiv Y) * (R rdiv Y) + Y * (I rdiv Y) * (I rdiv Y)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   366
        - 2 * (R rdiv Y * R + I rdiv Y * I)\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   367
      by (simp flip: minus_rmod_eq_mult_rdiv add: algebra_simps)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   368
    also have \<open>\<dots> = (Re (x mod y))\<^sup>2 + (Im (x mod y))\<^sup>2\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   369
      by (simp add: X_def Y_def R_def I_def algebra_simps power2_eq_square)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   370
    finally have lhs: \<open>int (euclidean_size (x mod y)) = ?lhs\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   371
      by (simp add: euclidean_size_gauss_def)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   372
    have \<open>?lhs * Y = (I rmod Y)\<^sup>2 + (R rmod Y)\<^sup>2\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   373
      apply (simp add: algebra_simps power2_eq_square \<open>X * Y = R\<^sup>2 + I\<^sup>2\<close>)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   374
      apply (simp flip: mult.assoc add.assoc minus_rmod_eq_mult_rdiv)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   375
      apply (simp add: algebra_simps)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   376
      done
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   377
    also have \<open>\<dots> \<le> (Y div 2)\<^sup>2 + (Y div 2)\<^sup>2\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   378
      by (rule add_mono) (use \<open>Y > 0\<close> abs_rmod_less_equal [of Y] in \<open>simp_all add: power2_le_iff_abs_le\<close>)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   379
    also have \<open>\<dots> < Y\<^sup>2\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   380
      using \<open>Y > 0\<close> by (cases \<open>Y = 1\<close>) (simp_all add: power2_eq_square mult_le_less_imp_less flip: mult.assoc)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   381
    finally have \<open>?lhs * Y < Y\<^sup>2\<close> .
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   382
    with \<open>Y > 0\<close> have \<open>?lhs < Y\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   383
      by (simp add: power2_eq_square)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   384
    then have \<open>int (euclidean_size (x mod y)) < int (euclidean_size y)\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   385
      by (simp only: lhs rhs)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   386
    then show ?thesis
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   387
      by simp
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   388
  qed
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   389
  show \<open>euclidean_size x \<le> euclidean_size (x * y)\<close> if \<open>y \<noteq> 0\<close> for x y :: gauss
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   390
  proof -
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   391
    from that have \<open>euclidean_size y > 0\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   392
      by (simp add: euclidean_size_gauss_def gauss_neq_0)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   393
    then have \<open>euclidean_size x \<le> euclidean_size x * euclidean_size y\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   394
      by simp
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   395
    also have \<open>\<dots> = nat (((Re x)\<^sup>2 + (Im x)\<^sup>2) * ((Re y)\<^sup>2 + (Im y)\<^sup>2))\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   396
      by (simp add: euclidean_size_gauss_def nat_mult_distrib)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   397
    also have \<open>\<dots> = euclidean_size (x * y)\<close>
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   398
      by (simp add: euclidean_size_gauss_def eq_nat_nat_iff) (simp add: algebra_simps power2_eq_square)
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   399
    finally show ?thesis .
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   400
  qed
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   401
qed
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   402
75955
5305c65dcbb2 Gauss numbers
haftmann
parents:
diff changeset
   403
end
76251
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   404
fbde7d1211fc euclidean division on gaussian numbers
haftmann
parents: 76250
diff changeset
   405
end