@@ -28,6 +28,7 @@ The proof of quadratic reciprocity implemented uses Gauss' lemma and Eisenstein'
28
28
-/
29
29
30
30
open function finset nat finite_field zmod
31
+ open_locale big_operators
31
32
32
33
namespace zmod
33
34
117
118
@[simp] lemma wilsons_lemma : (nat.fact (p - 1 ) : zmod p) = -1 :=
118
119
begin
119
120
refine
120
- calc (nat.fact (p - 1 ) : zmod p) = (Ico 1 (succ (p - 1 ))).prod (λ (x : ℕ ), x) :
121
+ calc (nat.fact (p - 1 ) : zmod p) = (∏ x in Ico 1 (succ (p - 1 )), x) :
121
122
by rw [← finset.prod_Ico_id_eq_fact, prod_nat_cast]
122
- ... = finset.univ.prod (λ x : units (zmod p), x) : _
123
+ ... = (∏ x : units (zmod p), x) : _
123
124
... = -1 :
124
125
by rw [prod_hom _ (coe : units (zmod p) → zmod p),
125
126
prod_univ_units_id_eq_neg_one, units.coe_neg, units.coe_one],
@@ -142,7 +143,7 @@ begin
142
143
{ simp only [val_cast_of_lt hb.right, units.coe_mk0], } }
143
144
end
144
145
145
- @[simp] lemma prod_Ico_one_prime : (Ico 1 p).prod (λ x , (x : zmod p)) = -1 :=
146
+ @[simp] lemma prod_Ico_one_prime : (∏ x in Ico 1 p, (x : zmod p)) = -1 :=
146
147
begin
147
148
conv in (Ico 1 p) { rw [← succ_sub_one p, succ_sub (nat.prime.pos ‹p.prime›)] },
148
149
rw [← prod_nat_cast, finset.prod_Ico_id_eq_fact, wilsons_lemma]
@@ -195,24 +196,24 @@ private lemma gauss_lemma_aux₁ (p : ℕ) [hp : fact p.prime] [hp2 : fact (p %
195
196
(-1 )^((Ico 1 (p / 2 ).succ).filter
196
197
(λ x : ℕ, ¬(a * x : zmod p).val ≤ p / 2 )).card * (p / 2 ).fact :=
197
198
calc (a ^ (p / 2 ) * (p / 2 ).fact : zmod p) =
198
- (Ico 1 (p / 2 ).succ).prod (λ x , a * x) :
199
+ (∏ x in Ico 1 (p / 2 ).succ, a * x) :
199
200
by rw [prod_mul_distrib, ← prod_nat_cast, ← prod_nat_cast, prod_Ico_id_eq_fact,
200
201
prod_const, Ico.card, succ_sub_one]; simp
201
- ... = (Ico 1 (p / 2 ).succ).prod (λ x , (a * x : zmod p).val) : by simp
202
- ... = (Ico 1 (p / 2 ).succ).prod
203
- (λ x, ( if (a * x : zmod p).val ≤ p / 2 then 1 else -1 ) *
202
+ ... = (∏ x in Ico 1 (p / 2 ).succ, (a * x : zmod p).val) : by simp
203
+ ... = (∏ x in Ico 1 (p / 2 ).succ,
204
+ (if (a * x : zmod p).val ≤ p / 2 then 1 else -1 ) *
204
205
(a * x : zmod p).val_min_abs.nat_abs) :
205
206
prod_congr rfl $ λ _ _, begin
206
207
simp only [cast_nat_abs_val_min_abs],
207
208
split_ifs; simp
208
209
end
209
210
... = (-1 )^((Ico 1 (p / 2 ).succ).filter
210
211
(λ x : ℕ, ¬(a * x : zmod p).val ≤ p / 2 )).card *
211
- (Ico 1 (p / 2 ).succ).prod (λ x , (a * x : zmod p).val_min_abs.nat_abs) :
212
- have (Ico 1 (p / 2 ).succ).prod
213
- (λ x, if (a * x : zmod p).val ≤ p / 2 then (1 : zmod p) else -1 ) =
214
- ((Ico 1 (p / 2 ).succ).filter
215
- (λ x : ℕ, ¬(a * x : zmod p).val ≤ p / 2 )).prod (λ _ , -1 ),
212
+ (∏ x in Ico 1 (p / 2 ).succ, (a * x : zmod p).val_min_abs.nat_abs) :
213
+ have (∏ x in Ico 1 (p / 2 ).succ,
214
+ if (a * x : zmod p).val ≤ p / 2 then (1 : zmod p) else -1 ) =
215
+ (∏ x in (Ico 1 (p / 2 ).succ).filter
216
+ (λ x : ℕ, ¬(a * x : zmod p).val ≤ p / 2 ), -1 ),
216
217
from prod_bij_ne_one (λ x _ _, x)
217
218
(λ x, by split_ifs; simp * at * {contextual := tt})
218
219
(λ _ _ _ _ _ _, id)
0 commit comments