@@ -156,13 +156,14 @@ end
156
156
157
157
/-- Gauss' lemma. The legendre symbol can be computed by considering the number of naturals less
158
158
than `p/2` such that `(a * x) % p > p / 2` -/
159
- lemma gauss_lemma {a : ℤ} [fact (p % 2 = 1 )] (ha0 : (a : zmod p) ≠ 0 ) :
159
+ lemma gauss_lemma {a : ℤ} (hp : p ≠ 2 ) (ha0 : (a : zmod p) ≠ 0 ) :
160
160
legendre_sym p a = (-1 ) ^ ((Ico 1 (p / 2 ).succ).filter
161
161
(λ x : ℕ, p / 2 < (a * x : zmod p).val)).card :=
162
- have (legendre_sym p a : zmod p) = (((-1 )^((Ico 1 (p / 2 ).succ).filter
163
- (λ x : ℕ, p / 2 < (a * x : zmod p).val)).card : ℤ) : zmod p),
164
- by rw [legendre_sym_eq_pow, legendre_symbol.gauss_lemma_aux p ha0]; simp,
165
162
begin
163
+ haveI hp' : fact (p % 2 = 1 ) := ⟨nat.prime.mod_two_eq_one_iff_ne_two.mpr hp⟩,
164
+ have : (legendre_sym p a : zmod p) = (((-1 )^((Ico 1 (p / 2 ).succ).filter
165
+ (λ x : ℕ, p / 2 < (a * x : zmod p).val)).card : ℤ) : zmod p) :=
166
+ by { rw [legendre_sym_eq_pow, legendre_symbol.gauss_lemma_aux p ha0]; simp },
166
167
cases legendre_sym_eq_one_or_neg_one p a ha0;
167
168
cases neg_one_pow_eq_or ℤ ((Ico 1 (p / 2 ).succ).filter
168
169
(λ x : ℕ, p / 2 < (a * x : zmod p).val)).card;
@@ -178,34 +179,36 @@ begin
178
179
{ simp only [h, iff_false], tauto }
179
180
end
180
181
181
- lemma eisenstein_lemma [fact (p % 2 = 1 )] {a : ℕ} (ha1 : a % 2 = 1 ) (ha0 : (a : zmod p) ≠ 0 ) :
182
+ lemma eisenstein_lemma (hp : p ≠ 2 ) {a : ℕ} (ha1 : a % 2 = 1 ) (ha0 : (a : zmod p) ≠ 0 ) :
182
183
legendre_sym p a = (-1 )^∑ x in Ico 1 (p / 2 ).succ, (x * a) / p :=
183
184
begin
185
+ haveI hp' : fact (p % 2 = 1 ) := ⟨nat.prime.mod_two_eq_one_iff_ne_two.mpr hp⟩,
184
186
have ha0' : ((a : ℤ) : zmod p) ≠ 0 := by { norm_cast, exact ha0 },
185
- rw [neg_one_pow_eq_pow_mod_two, gauss_lemma p ha0', neg_one_pow_eq_pow_mod_two,
187
+ rw [neg_one_pow_eq_pow_mod_two, gauss_lemma p hp ha0', neg_one_pow_eq_pow_mod_two,
186
188
(by norm_cast : ((a : ℤ) : zmod p) = (a : zmod p)),
187
189
show _ = _, from legendre_symbol.eisenstein_lemma_aux p ha1 ha0]
188
190
end
189
191
190
192
/-- **Quadratic reciprocity theorem** -/
191
- theorem quadratic_reciprocity [ hp1 : fact (p % 2 = 1 )] [ hq1 : fact (q % 2 = 1 )] (hpq : p ≠ q) :
193
+ theorem quadratic_reciprocity ( hp1 : p ≠ 2 ) ( hq1 : q ≠ 2 ) (hpq : p ≠ q) :
192
194
legendre_sym q p * legendre_sym p q = (-1 ) ^ ((p / 2 ) * (q / 2 )) :=
193
195
have hpq0 : (p : zmod q) ≠ 0 , from prime_ne_zero q p hpq.symm,
194
196
have hqp0 : (q : zmod p) ≠ 0 , from prime_ne_zero p q hpq,
195
- by rw [eisenstein_lemma q hp1.1 hpq0, eisenstein_lemma p hq1.1 hqp0,
197
+ by rw [eisenstein_lemma q hq1 (nat.prime.mod_two_eq_one_iff_ne_two.mpr hp1) hpq0,
198
+ eisenstein_lemma p hp1 (nat.prime.mod_two_eq_one_iff_ne_two.mpr hq1) hqp0,
196
199
← pow_add, legendre_symbol.sum_mul_div_add_sum_mul_div_eq_mul q p hpq0, mul_comm]
197
200
198
- lemma legendre_sym_two [hp1 : fact (p % 2 = 1 )] : legendre_sym p 2 = (-1 ) ^ (p / 4 + p / 2 ) :=
201
+ lemma legendre_sym_two (hp2 : p ≠ 2 ) : legendre_sym p 2 = (-1 ) ^ (p / 4 + p / 2 ) :=
199
202
begin
200
- have hp2 : p ≠ 2 , from mt (congr_arg (% 2 )) ( by simpa using hp1. 1 ) ,
203
+ have hp1 := nat.prime.mod_two_eq_one_iff_ne_two.mpr hp2 ,
201
204
have hp22 : p / 2 / 2 = _ := legendre_symbol.div_eq_filter_card (show 0 < 2 , from dec_trivial)
202
205
(nat.div_le_self (p / 2 ) 2 ),
203
206
have hcard : (Ico 1 (p / 2 ).succ).card = p / 2 , by simp,
204
207
have hx2 : ∀ x ∈ Ico 1 (p / 2 ).succ, (2 * x : zmod p).val = 2 * x,
205
208
from λ x hx, have h2xp : 2 * x < p,
206
209
from calc 2 * x ≤ 2 * (p / 2 ) : mul_le_mul_of_nonneg_left
207
210
(le_of_lt_succ $ (mem_Ico.mp hx).2 ) dec_trivial
208
- ... < _ : by conv_rhs {rw [← div_add_mod p 2 , hp1. 1 ]}; exact lt_succ_self _,
211
+ ... < _ : by conv_rhs {rw [← div_add_mod p 2 , hp1]}; exact lt_succ_self _,
209
212
by rw [← nat.cast_two, ← nat.cast_mul, val_cast_of_lt h2xp],
210
213
have hdisj : disjoint
211
214
((Ico 1 (p / 2 ).succ).filter (λ x, p / 2 < ((2 : ℕ) * x : zmod p).val))
@@ -222,44 +225,44 @@ begin
222
225
end ,
223
226
have hp2' := prime_ne_zero p 2 hp2,
224
227
rw (by norm_cast : ((2 : ℕ) : zmod p) = (2 : ℤ)) at *,
225
- erw [gauss_lemma p hp2',
228
+ erw [gauss_lemma p hp2 hp2 ',
226
229
neg_one_pow_eq_pow_mod_two, @neg_one_pow_eq_pow_mod_two _ _ (p / 4 + p / 2 )],
227
230
refine congr_arg2 _ rfl ((eq_iff_modeq_nat 2 ).1 _),
228
231
rw [show 4 = 2 * 2 , from rfl, ← nat.div_div_eq_div_mul, hp22, nat.cast_add,
229
232
← sub_eq_iff_eq_add', sub_eq_add_neg, neg_eq_self_mod_two,
230
233
← nat.cast_add, ← card_disjoint_union hdisj, hunion, hcard]
231
234
end
232
235
233
- lemma exists_sq_eq_two_iff [ hp1 : fact (p % 2 = 1 )] :
236
+ lemma exists_sq_eq_two_iff ( hp1 : p ≠ 2 ) :
234
237
(∃ a : zmod p, a ^ 2 = 2 ) ↔ p % 8 = 1 ∨ p % 8 = 7 :=
235
238
have hp2 : ((2 : ℤ) : zmod p) ≠ 0 ,
236
- from prime_ne_zero p 2 (λ h, by simpa [h] using hp1. 1 ),
239
+ from prime_ne_zero p 2 (λ h, by simpa [h] using hp1),
237
240
have hpm4 : p % 4 = p % 8 % 4 , from (nat.mod_mul_left_mod p 2 4 ).symm,
238
241
have hpm2 : p % 2 = p % 8 % 2 , from (nat.mod_mul_left_mod p 4 2 ).symm,
239
242
begin
240
243
rw [show (2 : zmod p) = (2 : ℤ), by simp, ← legendre_sym_eq_one_iff p hp2],
241
- erw [legendre_sym_two p, neg_one_pow_eq_one_iff_even (show (-1 : ℤ) ≠ 1 , from dec_trivial),
244
+ erw [legendre_sym_two p hp1 , neg_one_pow_eq_one_iff_even (show (-1 : ℤ) ≠ 1 , from dec_trivial),
242
245
even_add, even_div, even_div],
243
246
have := nat.mod_lt p (show 0 < 8 , from dec_trivial),
244
- resetI, rw fact_iff at hp1,
245
- revert this hp1 ,
247
+ have hp := nat.prime.mod_two_eq_one_iff_ne_two.mpr hp1,
248
+ revert this hp ,
246
249
erw [hpm4, hpm2],
247
250
generalize hm : p % 8 = m, unfreezingI {clear_dependent p},
248
251
dec_trivial!,
249
252
end
250
253
251
- lemma exists_sq_eq_prime_iff_of_mod_four_eq_one (hp1 : p % 4 = 1 ) [ hq1 : fact (q % 2 = 1 )] :
254
+ lemma exists_sq_eq_prime_iff_of_mod_four_eq_one (hp1 : p % 4 = 1 ) ( hq1 : q ≠ 2 ) :
252
255
(∃ a : zmod p, a ^ 2 = q) ↔ ∃ b : zmod q, b ^ 2 = p :=
253
256
if hpq : p = q then by substI hpq else
254
257
have h1 : ((p / 2 ) * (q / 2 )) % 2 = 0 ,
255
258
from (dvd_iff_mod_eq_zero _ _).1
256
259
(dvd_mul_of_dvd_left ((dvd_iff_mod_eq_zero _ _).2 $
257
260
by rw [← mod_mul_right_div_self, show 2 * 2 = 4 , from rfl, hp1]; refl) _),
258
261
begin
259
- haveI hp_odd : fact (p % 2 = 1 ) := ⟨odd_of_mod_four_eq_one hp1⟩ ,
262
+ have hp_odd : p ≠ 2 := by { by_contra, simp [h] at hp1, norm_num at hp1, } ,
260
263
have hpq0 : (p : zmod q) ≠ 0 := prime_ne_zero q p (ne.symm hpq),
261
264
have hqp0 : (q : zmod p) ≠ 0 := prime_ne_zero p q hpq,
262
- have := quadratic_reciprocity p q hpq,
265
+ have := quadratic_reciprocity p q hp_odd hq1 hpq,
263
266
rw [neg_one_pow_eq_pow_mod_two, h1, legendre_sym, legendre_sym, int.cast_coe_nat,
264
267
int.cast_coe_nat, if_neg hqp0, if_neg hpq0] at this ,
265
268
rw [euler_criterion q hpq0, euler_criterion p hqp0],
@@ -273,11 +276,11 @@ have h1 : ((p / 2) * (q / 2)) % 2 = 1,
273
276
(by rw [← mod_mul_right_div_self, show 2 * 2 = 4 , from rfl, hp3]; refl)
274
277
(by rw [← mod_mul_right_div_self, show 2 * 2 = 4 , from rfl, hq3]; refl),
275
278
begin
276
- haveI hp_odd : fact (p % 2 = 1 ) := ⟨odd_of_mod_four_eq_three hp3⟩ ,
277
- haveI hq_odd : fact (q % 2 = 1 ) := ⟨odd_of_mod_four_eq_three hq3⟩ ,
279
+ have hp_odd : p ≠ 2 := by { by_contra, simp [h] at hp3, norm_num at hp3, } ,
280
+ have hq_odd : q ≠ 2 := by { by_contra, simp [h] at hq3, norm_num at hq3, } ,
278
281
have hpq0 : (p : zmod q) ≠ 0 := prime_ne_zero q p (ne.symm hpq),
279
282
have hqp0 : (q : zmod p) ≠ 0 := prime_ne_zero p q hpq,
280
- have := quadratic_reciprocity p q hpq,
283
+ have := quadratic_reciprocity p q hp_odd hq_odd hpq,
281
284
rw [neg_one_pow_eq_pow_mod_two, h1, legendre_sym, legendre_sym, int.cast_coe_nat,
282
285
int.cast_coe_nat, if_neg hpq0, if_neg hqp0] at this ,
283
286
rw [euler_criterion q hpq0, euler_criterion p hqp0],
0 commit comments