@@ -356,7 +356,7 @@ namespace zmod
356
356
* `-1` otherwise.
357
357
358
358
-/
359
- def legendre_sym (a p : ℕ) : ℤ :=
359
+ def legendre_sym (a : ℤ) ( p : ℕ) : ℤ :=
360
360
if (a : zmod p) = 0 then 0
361
361
else if (a : zmod p) ^ (p / 2 ) = 1 then 1
362
362
else -1
@@ -366,12 +366,13 @@ lemma legendre_sym_eq_pow (a p : ℕ) [hp : fact p.prime] :
366
366
begin
367
367
rw legendre_sym,
368
368
by_cases ha : (a : zmod p) = 0 ,
369
- { simp only [if_pos, ha, zero_pow (nat.div_pos (hp.1 .two_le) (succ_pos 1 )), int.cast_zero] },
369
+ { simp only [int.cast_coe_nat, if_pos, ha,
370
+ zero_pow (nat.div_pos (hp.1 .two_le) (succ_pos 1 )), int.cast_zero] },
370
371
cases hp.1 .eq_two_or_odd with hp2 hp_odd,
371
372
{ substI p,
372
373
generalize : (a : (zmod 2 )) = b, revert b, dec_trivial, },
373
374
{ haveI := fact.mk hp_odd,
374
- rw if_neg ha,
375
+ rw [int.cast_coe_nat, if_neg ha] ,
375
376
have : (-1 : zmod p) ≠ 1 , from (ne_neg_self p one_ne_zero).symm,
376
377
cases pow_div_two_eq_neg_one_or_one p ha with h h,
377
378
{ rw [if_pos h, h, int.cast_one], },
380
381
381
382
lemma legendre_sym_eq_one_or_neg_one (a p : ℕ) (ha : (a : zmod p) ≠ 0 ) :
382
383
legendre_sym a p = -1 ∨ legendre_sym a p = 1 :=
383
- by unfold legendre_sym; split_ifs; simp only [*, eq_self_iff_true, or_true, true_or] at *
384
+ begin
385
+ unfold legendre_sym,
386
+ split_ifs;
387
+ simp only [*, eq_self_iff_true, or_true, true_or, int.cast_coe_nat] at *,
388
+ end
384
389
385
390
lemma legendre_sym_eq_zero_iff (a p : ℕ) :
386
391
legendre_sym a p = 0 ↔ (a : zmod p) = 0 :=
@@ -389,7 +394,7 @@ begin
389
394
{ classical, contrapose,
390
395
assume ha, cases legendre_sym_eq_one_or_neg_one a p ha with h h,
391
396
all_goals { rw h, norm_num } },
392
- { assume ha, rw [legendre_sym, if_pos ha] }
397
+ { assume ha, rw [legendre_sym, int.cast_coe_nat, if_pos ha] }
393
398
end
394
399
395
400
/-- Gauss' lemma. The legendre symbol can be computed by considering the number of naturals less
410
415
lemma legendre_sym_eq_one_iff {a : ℕ} (ha0 : (a : zmod p) ≠ 0 ) :
411
416
legendre_sym a p = 1 ↔ (∃ b : zmod p, b ^ 2 = a) :=
412
417
begin
413
- rw [euler_criterion p ha0, legendre_sym, if_neg ha0],
418
+ rw [euler_criterion p ha0, legendre_sym, int.cast_coe_nat, if_neg ha0],
414
419
split_ifs,
415
420
{ simp only [h, eq_self_iff_true] },
416
421
{ simp only [h, iff_false], tauto }
@@ -456,7 +461,7 @@ have hunion :
456
461
exact filter_congr (λ x hx, by simp [hx2 _ hx, lt_or_le, mul_comm])
457
462
end ,
458
463
begin
459
- rw [gauss_lemma p (prime_ne_zero p 2 hp2),
464
+ erw [gauss_lemma p (prime_ne_zero p 2 hp2),
460
465
neg_one_pow_eq_pow_mod_two, @neg_one_pow_eq_pow_mod_two _ _ (p / 4 + p / 2 )],
461
466
refine congr_arg2 _ rfl ((eq_iff_modeq_nat 2 ).1 _),
462
467
rw [show 4 = 2 * 2 , from rfl, ← nat.div_div_eq_div_mul, hp22, nat.cast_add,
@@ -471,8 +476,8 @@ have hp2 : ((2 : ℕ) : zmod p) ≠ 0,
471
476
have hpm4 : p % 4 = p % 8 % 4 , from (nat.mod_mul_left_mod p 2 4 ).symm,
472
477
have hpm2 : p % 2 = p % 8 % 2 , from (nat.mod_mul_left_mod p 4 2 ).symm,
473
478
begin
474
- rw [show (2 : zmod p) = (2 : ℕ), by simp, ← legendre_sym_eq_one_iff p hp2,
475
- legendre_sym_two p, neg_one_pow_eq_one_iff_even (show (-1 : ℤ) ≠ 1 , from dec_trivial),
479
+ rw [show (2 : zmod p) = (2 : ℕ), by simp, ← legendre_sym_eq_one_iff p hp2] ,
480
+ erw [ legendre_sym_two p, neg_one_pow_eq_one_iff_even (show (-1 : ℤ) ≠ 1 , from dec_trivial),
476
481
even_add, even_div, even_div],
477
482
have := nat.mod_lt p (show 0 < 8 , from dec_trivial),
478
483
resetI, rw fact_iff at hp1,
@@ -494,8 +499,8 @@ begin
494
499
have hpq0 : (p : zmod q) ≠ 0 := prime_ne_zero q p (ne.symm hpq),
495
500
have hqp0 : (q : zmod p) ≠ 0 := prime_ne_zero p q hpq,
496
501
have := quadratic_reciprocity p q hpq,
497
- rw [neg_one_pow_eq_pow_mod_two, h1, legendre_sym, legendre_sym,
498
- if_neg hqp0, if_neg hpq0] at this ,
502
+ rw [neg_one_pow_eq_pow_mod_two, h1, legendre_sym, legendre_sym, int.cast_coe_nat,
503
+ int.cast_coe_nat, if_neg hqp0, if_neg hpq0] at this ,
499
504
rw [euler_criterion q hpq0, euler_criterion p hqp0],
500
505
split_ifs at this ; simp *; contradiction,
501
506
end
@@ -512,8 +517,8 @@ begin
512
517
have hpq0 : (p : zmod q) ≠ 0 := prime_ne_zero q p (ne.symm hpq),
513
518
have hqp0 : (q : zmod p) ≠ 0 := prime_ne_zero p q hpq,
514
519
have := quadratic_reciprocity p q hpq,
515
- rw [neg_one_pow_eq_pow_mod_two, h1, legendre_sym, legendre_sym,
516
- if_neg hpq0, if_neg hqp0] at this ,
520
+ rw [neg_one_pow_eq_pow_mod_two, h1, legendre_sym, legendre_sym, int.cast_coe_nat,
521
+ int.cast_coe_nat, if_neg hpq0, if_neg hqp0] at this ,
517
522
rw [euler_criterion q hpq0, euler_criterion p hqp0],
518
523
split_ifs at this ; simp *; contradiction
519
524
end
0 commit comments