data.zmod.defs
⟷
Mathlib.Data.ZMod.Defs
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
@@ -57,15 +57,27 @@ private lemma left_distrib_aux (n : ℕ) : ∀ a b c : fin n, a * (b + c) = a *
... ≡ (a * b) % n + (a * c) % n [MOD n] :
(nat.mod_modeq _ _).symm.add (nat.mod_modeq _ _).symm)
+instance (n : ℕ) : distrib (fin n) :=
+{ left_distrib := left_distrib_aux n,
+ right_distrib := λ a b c, by rw [mul_comm, left_distrib_aux, mul_comm _ b, mul_comm]; refl,
+ ..fin.add_comm_semigroup n,
+ ..fin.comm_semigroup n }
+
/-- Commutative ring structure on `fin n`. -/
instance (n : ℕ) [ne_zero n] : comm_ring (fin n) :=
{ one_mul := fin.one_mul,
mul_one := fin.mul_one,
- left_distrib := left_distrib_aux n,
- right_distrib := λ a b c, by rw [mul_comm, left_distrib_aux, mul_comm _ b, mul_comm]; refl,
..fin.add_monoid_with_one,
..fin.add_comm_group n,
- ..fin.comm_semigroup n }
+ ..fin.comm_semigroup n,
+ ..fin.distrib n }
+
+/-- Note this is more general than `fin.comm_ring` as it applies (vacuously) to `fin 0` too. -/
+instance (n : ℕ) : has_distrib_neg (fin n) :=
+{ neg := has_neg.neg,
+ mul_neg := nat.cases_on n fin_zero_elim $ λ i, mul_neg,
+ neg_mul := nat.cases_on n fin_zero_elim $ λ i, neg_mul,
+ ..fin.has_involutive_neg n }
end fin
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(first ported)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -172,7 +172,7 @@ instance commRing (n : ℕ) : CommRing (ZMod n)
natCast_zero := Nat.casesOn n (@Nat.cast_zero Int _) fun n => @Nat.cast_zero (Fin n.succ) _
natCast_succ := Nat.casesOn n (@Nat.cast_succ Int _) fun n => @Nat.cast_succ (Fin n.succ) _
intCast := Nat.casesOn n (coe : ℤ → ℤ) fun n => (coe : ℤ → Fin n.succ)
- intCast_ofNat := Nat.casesOn n (@Int.cast_ofNat Int _) fun n => @Int.cast_ofNat (Fin n.succ) _
+ intCast_ofNat := Nat.casesOn n (@Int.cast_natCast Int _) fun n => @Int.cast_natCast (Fin n.succ) _
intCast_negSucc :=
Nat.casesOn n (@Int.cast_negSucc Int _) fun n => @Int.cast_negSucc (Fin n.succ) _
left_distrib := Nat.casesOn n (@left_distrib Int _ _ _) fun n => @left_distrib (Fin n.succ) _ _ _
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Rodriguez
-/
import Algebra.NeZero
-import Data.Nat.Modeq
+import Data.Nat.ModEq
import Data.Fintype.Lattice
#align_import data.zmod.defs from "leanprover-community/mathlib"@"3a2b5524a138b5d0b818b858b516d4ac8a484b03"
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,9 +3,9 @@ Copyright (c) 2022 Eric Rodriguez. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Rodriguez
-/
-import Mathbin.Algebra.NeZero
-import Mathbin.Data.Nat.Modeq
-import Mathbin.Data.Fintype.Lattice
+import Algebra.NeZero
+import Data.Nat.Modeq
+import Data.Fintype.Lattice
#align_import data.zmod.defs from "leanprover-community/mathlib"@"3a2b5524a138b5d0b818b858b516d4ac8a484b03"
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -52,16 +52,16 @@ instance (n : ℕ) : CommSemigroup (Fin n) :=
mul_assoc := fun ⟨a, ha⟩ ⟨b, hb⟩ ⟨c, hc⟩ =>
Fin.eq_of_veq
(calc
- a * b % n * c ≡ a * b * c [MOD n] := (Nat.mod_modEq _ _).mul_right _
+ a * b % n * c ≡ a * b * c [MOD n] := (Nat.mod_modEq _ _).hMul_right _
_ ≡ a * (b * c) [MOD n] := by rw [mul_assoc]
- _ ≡ a * (b * c % n) [MOD n] := (Nat.mod_modEq _ _).symm.mul_left _)
+ _ ≡ a * (b * c % n) [MOD n] := (Nat.mod_modEq _ _).symm.hMul_left _)
mul_comm := Fin.mul_comm }
private theorem left_distrib_aux (n : ℕ) : ∀ a b c : Fin n, a * (b + c) = a * b + a * c :=
fun ⟨a, ha⟩ ⟨b, hb⟩ ⟨c, hc⟩ =>
Fin.eq_of_veq
(calc
- a * ((b + c) % n) ≡ a * (b + c) [MOD n] := (Nat.mod_modEq _ _).mul_left _
+ a * ((b + c) % n) ≡ a * (b + c) [MOD n] := (Nat.mod_modEq _ _).hMul_left _
_ ≡ a * b + a * c [MOD n] := by rw [mul_add]
_ ≡ a * b % n + a * c % n [MOD n] := (Nat.mod_modEq _ _).symm.add (Nat.mod_modEq _ _).symm)
@@ -83,8 +83,8 @@ instance (n : ℕ) [NeZero n] : CommRing (Fin n) :=
instance (n : ℕ) : HasDistribNeg (Fin n) :=
{ Fin.hasInvolutiveNeg n with
neg := Neg.neg
- mul_neg := Nat.casesOn n finZeroElim fun i => mul_neg
- neg_mul := Nat.casesOn n finZeroElim fun i => neg_mul }
+ hMul_neg := Nat.casesOn n finZeroElim fun i => mul_neg
+ neg_hMul := Nat.casesOn n finZeroElim fun i => neg_mul }
end Fin
mathlib commit https://github.com/leanprover-community/mathlib/commit/63721b2c3eba6c325ecf8ae8cca27155a4f6306f
@@ -76,8 +76,8 @@ instance (n : ℕ) : Distrib (Fin n) :=
instance (n : ℕ) [NeZero n] : CommRing (Fin n) :=
{ Fin.instAddMonoidWithOne, Fin.addCommGroup n, Fin.instCommSemigroup n,
Fin.instDistrib n with
- one_mul := Fin.one_mul
- mul_one := Fin.mul_one }
+ one_mul := Fin.one_mul'
+ mul_one := Fin.mul_one' }
/-- Note this is more general than `fin.comm_ring` as it applies (vacuously) to `fin 0` too. -/
instance (n : ℕ) : HasDistribNeg (Fin n) :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,16 +2,13 @@
Copyright (c) 2022 Eric Rodriguez. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Rodriguez
-
-! This file was ported from Lean 3 source module data.zmod.defs
-! leanprover-community/mathlib commit 3a2b5524a138b5d0b818b858b516d4ac8a484b03
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Algebra.NeZero
import Mathbin.Data.Nat.Modeq
import Mathbin.Data.Fintype.Lattice
+#align_import data.zmod.defs from "leanprover-community/mathlib"@"3a2b5524a138b5d0b818b858b516d4ac8a484b03"
+
/-!
# Definition of `zmod n` + basic results.
mathlib commit https://github.com/leanprover-community/mathlib/commit/bf2428c9486c407ca38b5b3fb10b87dad0bc99fa
@@ -70,15 +70,15 @@ private theorem left_distrib_aux (n : ℕ) : ∀ a b c : Fin n, a * (b + c) = a
instance (n : ℕ) : Distrib (Fin n) :=
{ Fin.addCommSemigroup n,
- Fin.commSemigroup n with
+ Fin.instCommSemigroup n with
left_distrib := left_distrib_aux n
right_distrib := fun a b c => by
rw [mul_comm, left_distrib_aux, mul_comm _ b, mul_comm] <;> rfl }
/-- Commutative ring structure on `fin n`. -/
instance (n : ℕ) [NeZero n] : CommRing (Fin n) :=
- { Fin.addMonoidWithOne, Fin.addCommGroup n, Fin.commSemigroup n,
- Fin.distrib n with
+ { Fin.instAddMonoidWithOne, Fin.addCommGroup n, Fin.instCommSemigroup n,
+ Fin.instDistrib n with
one_mul := Fin.one_mul
mul_one := Fin.mul_one }
mathlib commit https://github.com/leanprover-community/mathlib/commit/b01d6eb9d0a308807af54319b264d0994b91774b
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Rodriguez
! This file was ported from Lean 3 source module data.zmod.defs
-! leanprover-community/mathlib commit 63f84d91dd847f50bae04a01071f3a5491934e36
+! leanprover-community/mathlib commit 3a2b5524a138b5d0b818b858b516d4ac8a484b03
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -68,16 +68,27 @@ private theorem left_distrib_aux (n : ℕ) : ∀ a b c : Fin n, a * (b + c) = a
_ ≡ a * b + a * c [MOD n] := by rw [mul_add]
_ ≡ a * b % n + a * c % n [MOD n] := (Nat.mod_modEq _ _).symm.add (Nat.mod_modEq _ _).symm)
-/-- Commutative ring structure on `fin n`. -/
-instance (n : ℕ) [NeZero n] : CommRing (Fin n) :=
- { Fin.addMonoidWithOne, Fin.addCommGroup n,
+instance (n : ℕ) : Distrib (Fin n) :=
+ { Fin.addCommSemigroup n,
Fin.commSemigroup n with
- one_mul := Fin.one_mul
- mul_one := Fin.mul_one
left_distrib := left_distrib_aux n
right_distrib := fun a b c => by
rw [mul_comm, left_distrib_aux, mul_comm _ b, mul_comm] <;> rfl }
+/-- Commutative ring structure on `fin n`. -/
+instance (n : ℕ) [NeZero n] : CommRing (Fin n) :=
+ { Fin.addMonoidWithOne, Fin.addCommGroup n, Fin.commSemigroup n,
+ Fin.distrib n with
+ one_mul := Fin.one_mul
+ mul_one := Fin.mul_one }
+
+/-- Note this is more general than `fin.comm_ring` as it applies (vacuously) to `fin 0` too. -/
+instance (n : ℕ) : HasDistribNeg (Fin n) :=
+ { Fin.hasInvolutiveNeg n with
+ neg := Neg.neg
+ mul_neg := Nat.casesOn n finZeroElim fun i => mul_neg
+ neg_mul := Nat.casesOn n finZeroElim fun i => neg_mul }
+
end Fin
#print ZMod /-
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -57,8 +57,7 @@ instance (n : ℕ) : CommSemigroup (Fin n) :=
(calc
a * b % n * c ≡ a * b * c [MOD n] := (Nat.mod_modEq _ _).mul_right _
_ ≡ a * (b * c) [MOD n] := by rw [mul_assoc]
- _ ≡ a * (b * c % n) [MOD n] := (Nat.mod_modEq _ _).symm.mul_left _
- )
+ _ ≡ a * (b * c % n) [MOD n] := (Nat.mod_modEq _ _).symm.mul_left _)
mul_comm := Fin.mul_comm }
private theorem left_distrib_aux (n : ℕ) : ∀ a b c : Fin n, a * (b + c) = a * b + a * c :=
@@ -67,8 +66,7 @@ private theorem left_distrib_aux (n : ℕ) : ∀ a b c : Fin n, a * (b + c) = a
(calc
a * ((b + c) % n) ≡ a * (b + c) [MOD n] := (Nat.mod_modEq _ _).mul_left _
_ ≡ a * b + a * c [MOD n] := by rw [mul_add]
- _ ≡ a * b % n + a * c % n [MOD n] := (Nat.mod_modEq _ _).symm.add (Nat.mod_modEq _ _).symm
- )
+ _ ≡ a * b % n + a * c % n [MOD n] := (Nat.mod_modEq _ _).symm.add (Nat.mod_modEq _ _).symm)
/-- Commutative ring structure on `fin n`. -/
instance (n : ℕ) [NeZero n] : CommRing (Fin n) :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -155,7 +155,7 @@ instance commRing (n : ℕ) : CommRing (ZMod n)
Nat.casesOn n (@CommRing.nsmul_zero' Int _) fun n => @CommRing.nsmul_zero' (Fin n.succ) _
nsmul_succ :=
Nat.casesOn n (@CommRing.nsmul_succ' Int _) fun n => @CommRing.nsmul_succ' (Fin n.succ) _
- add_left_neg := by cases n; exacts[@add_left_neg Int _, @add_left_neg (Fin n.succ) _]
+ add_left_neg := by cases n; exacts [@add_left_neg Int _, @add_left_neg (Fin n.succ) _]
add_comm := Nat.casesOn n (@add_comm Int _) fun n => @add_comm (Fin n.succ) _
mul := Nat.casesOn n (@Mul.mul Int _) fun n => @Mul.mul (Fin n.succ) _
mul_assoc := Nat.casesOn n (@mul_assoc Int _) fun n => @mul_assoc (Fin n.succ) _
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -155,9 +155,7 @@ instance commRing (n : ℕ) : CommRing (ZMod n)
Nat.casesOn n (@CommRing.nsmul_zero' Int _) fun n => @CommRing.nsmul_zero' (Fin n.succ) _
nsmul_succ :=
Nat.casesOn n (@CommRing.nsmul_succ' Int _) fun n => @CommRing.nsmul_succ' (Fin n.succ) _
- add_left_neg := by
- cases n
- exacts[@add_left_neg Int _, @add_left_neg (Fin n.succ) _]
+ add_left_neg := by cases n; exacts[@add_left_neg Int _, @add_left_neg (Fin n.succ) _]
add_comm := Nat.casesOn n (@add_comm Int _) fun n => @add_comm (Fin n.succ) _
mul := Nat.casesOn n (@Mul.mul Int _) fun n => @Mul.mul (Fin n.succ) _
mul_assoc := Nat.casesOn n (@mul_assoc Int _) fun n => @mul_assoc (Fin n.succ) _
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -69,7 +69,6 @@ private theorem left_distrib_aux (n : ℕ) : ∀ a b c : Fin n, a * (b + c) = a
_ ≡ a * b + a * c [MOD n] := by rw [mul_add]
_ ≡ a * b % n + a * c % n [MOD n] := (Nat.mod_modEq _ _).symm.add (Nat.mod_modEq _ _).symm
)
-#align fin.left_distrib_aux fin.left_distrib_aux
/-- Commutative ring structure on `fin n`. -/
instance (n : ℕ) [NeZero n] : CommRing (Fin n) :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
OfNat
and Nat.cast
lemmas (#11861)
This renames
Int.cast_ofNat
to Int.cast_natCast
Int.int_cast_ofNat
to Int.cast_ofNat
I think the history here is that this lemma was previously about Int.ofNat
, before we globally fixed the simp-normal form to be Nat.cast
.
Since the Int.cast_ofNat
name is repurposed, it can't be deprecated. Int.int_cast_ofNat
is such a wonky name that it was probably never used.
@@ -169,7 +169,7 @@ instance commRing (n : ℕ) : CommRing (ZMod n) where
natCast_zero := Nat.casesOn n (@Nat.cast_zero Int _) fun n => @Nat.cast_zero (Fin n.succ) _
natCast_succ := Nat.casesOn n (@Nat.cast_succ Int _) fun n => @Nat.cast_succ (Fin n.succ) _
intCast := Nat.casesOn n ((↑) : ℤ → ℤ) fun n => ((↑) : ℤ → Fin n.succ)
- intCast_ofNat := Nat.casesOn n (@Int.cast_ofNat Int _) fun n => @Int.cast_ofNat (Fin n.succ) _
+ intCast_ofNat := Nat.casesOn n (@Int.cast_natCast Int _) fun n => @Int.cast_natCast (Fin n.succ) _
intCast_negSucc :=
Nat.casesOn n (@Int.cast_negSucc Int _) fun n => @Int.cast_negSucc (Fin n.succ) _
left_distrib := Nat.casesOn n (@left_distrib Int _ _ _) fun n => @left_distrib (Fin n.succ) _ _ _
Homogenises porting notes via capitalisation and addition of whitespace.
It makes the following changes:
@@ -75,7 +75,7 @@ instance instCommRing (n : ℕ) [NeZero n] : CommRing (Fin n) :=
{ Fin.instAddMonoidWithOne n, Fin.addCommGroup n, Fin.instCommSemigroup n, Fin.instDistrib n with
one_mul := Fin.one_mul'
mul_one := Fin.mul_one',
- -- porting note: new, see
+ -- Porting note: new, see
-- https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/ring.20vs.20Ring/near/322876462
zero_mul := Fin.zero_mul'
mul_zero := Fin.mul_zero' }
@@ -157,7 +157,7 @@ instance commRing (n : ℕ) : CommRing (ZMod n) where
nsmul_succ := Nat.casesOn n
(inferInstanceAs (CommRing ℤ)).nsmul_succ
fun n => (inferInstanceAs (CommRing (Fin n.succ))).nsmul_succ
- -- porting note: `match` didn't work here
+ -- Porting note: `match` didn't work here
add_left_neg := Nat.casesOn n (@add_left_neg Int _) fun n => @add_left_neg (Fin n.succ) _
add_comm := Nat.casesOn n (@add_comm Int _) fun n => @add_comm (Fin n.succ) _
mul := Nat.casesOn n (@Mul.mul Int _) fun n => @Mul.mul (Fin n.succ) _
@@ -176,11 +176,11 @@ instance commRing (n : ℕ) : CommRing (ZMod n) where
right_distrib :=
Nat.casesOn n (@right_distrib Int _ _ _) fun n => @right_distrib (Fin n.succ) _ _ _
mul_comm := Nat.casesOn n (@mul_comm Int _) fun n => @mul_comm (Fin n.succ) _
- -- porting note: new, see
+ -- Porting note: new, see
-- https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/ring.20vs.20Ring/near/322876462
zero_mul := Nat.casesOn n (@zero_mul Int _) fun n => @zero_mul (Fin n.succ) _
mul_zero := Nat.casesOn n (@mul_zero Int _) fun n => @mul_zero (Fin n.succ) _
- -- porting note: all npow fields are new, but probably should be backported
+ -- Porting note: all npow fields are new, but probably should be backported
npow := Nat.casesOn n
(inferInstanceAs (CommRing ℤ)).npow fun n => (inferInstanceAs (CommRing (Fin n.succ))).npow
npow_zero := Nat.casesOn n
Fin.eq_of_veq
and Fin.veq_of_eq
(#10626)
We have Fin.eq_of_val_eq
and Fin.val_eq_of_eq
in Lean core now.
Also slightly shake the tree.
@@ -46,7 +46,7 @@ open Nat.ModEq Int
instance instCommSemigroup (n : ℕ) : CommSemigroup (Fin n) :=
{ inferInstanceAs (Mul (Fin n)) with
mul_assoc := fun ⟨a, ha⟩ ⟨b, hb⟩ ⟨c, hc⟩ =>
- Fin.eq_of_veq <|
+ Fin.eq_of_val_eq <|
calc
a * b % n * c ≡ a * b * c [MOD n] := (Nat.mod_modEq _ _).mul_right _
_ ≡ a * (b * c) [MOD n] := by rw [mul_assoc]
@@ -56,7 +56,7 @@ instance instCommSemigroup (n : ℕ) : CommSemigroup (Fin n) :=
private theorem left_distrib_aux (n : ℕ) : ∀ a b c : Fin n, a * (b + c) = a * b + a * c :=
fun ⟨a, ha⟩ ⟨b, hb⟩ ⟨c, hc⟩ =>
- Fin.eq_of_veq <|
+ Fin.eq_of_val_eq <|
calc
a * ((b + c) % n) ≡ a * (b + c) [MOD n] := (Nat.mod_modEq _ _).mul_left _
_ ≡ a * b + a * c [MOD n] := by rw [mul_add]
@@ -5,7 +5,7 @@ Authors: Eric Rodriguez
-/
import Mathlib.Algebra.NeZero
import Mathlib.Data.Nat.ModEq
-import Mathlib.Data.Fintype.Lattice
+import Mathlib.Data.Fintype.Card
#align_import data.zmod.defs from "leanprover-community/mathlib"@"3a2b5524a138b5d0b818b858b516d4ac8a484b03"
Fin
(#8510)
Unique
should be available earlier than results about Fin n
, by virtue of being a very basic logic typeclass with no dependencies on Nat or algebra.
This also generalizes some of the moved instances and lemmas. There are no new declarations in this PR, only renames of existing ones.
@@ -108,7 +108,7 @@ instance ZMod.repr : ∀ n : ℕ, Repr (ZMod n)
namespace ZMod
-instance instUnique : Unique (ZMod 1) := Fin.unique
+instance instUnique : Unique (ZMod 1) := Fin.uniqueFinOne
instance fintype : ∀ (n : ℕ) [NeZero n], Fintype (ZMod n)
| 0, h => (h.ne rfl).elim
@@ -108,6 +108,8 @@ instance ZMod.repr : ∀ n : ℕ, Repr (ZMod n)
namespace ZMod
+instance instUnique : Unique (ZMod 1) := Fin.unique
+
instance fintype : ∀ (n : ℕ) [NeZero n], Fintype (ZMod n)
| 0, h => (h.ne rfl).elim
| n + 1, _ => Fin.fintype (n + 1)
@@ -70,7 +70,7 @@ instance instDistrib (n : ℕ) : Distrib (Fin n) :=
rw [mul_comm, left_distrib_aux, mul_comm _ b, mul_comm] }
#align fin.distrib Fin.instDistrib
-/-- Commutative ring structure on `fin n`. -/
+/-- Commutative ring structure on `Fin n`. -/
instance instCommRing (n : ℕ) [NeZero n] : CommRing (Fin n) :=
{ Fin.instAddMonoidWithOne n, Fin.addCommGroup n, Fin.instCommSemigroup n, Fin.instDistrib n with
one_mul := Fin.one_mul'
@@ -81,7 +81,7 @@ instance instCommRing (n : ℕ) [NeZero n] : CommRing (Fin n) :=
mul_zero := Fin.mul_zero' }
#align fin.comm_ring Fin.instCommRing
-/-- Note this is more general than `fin.comm_ring` as it applies (vacuously) to `fin 0` too. -/
+/-- Note this is more general than `Fin.instCommRing` as it applies (vacuously) to `Fin 0` too. -/
instance instHasDistribNeg (n : ℕ) : HasDistribNeg (Fin n) :=
{ toInvolutiveNeg := Fin.instInvolutiveNeg n
mul_neg := Nat.casesOn n finZeroElim fun _i => mul_neg
Various adaptations to changes when Fin
API was moved to Std. One notable change is that many lemmas are now stated in terms of i ≠ 0
(for i : Fin n
) rather then i.1 ≠ 0
, and as a consequence many Fin.vne_of_ne
applications have been added or removed, mostly removed.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Wojciech Nawrocki <wjnawrocki@protonmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -73,12 +73,12 @@ instance instDistrib (n : ℕ) : Distrib (Fin n) :=
/-- Commutative ring structure on `fin n`. -/
instance instCommRing (n : ℕ) [NeZero n] : CommRing (Fin n) :=
{ Fin.instAddMonoidWithOne n, Fin.addCommGroup n, Fin.instCommSemigroup n, Fin.instDistrib n with
- one_mul := Fin.one_mul
- mul_one := Fin.mul_one,
+ one_mul := Fin.one_mul'
+ mul_one := Fin.mul_one',
-- porting note: new, see
-- https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/ring.20vs.20Ring/near/322876462
- zero_mul := Fin.zero_mul
- mul_zero := Fin.mul_zero }
+ zero_mul := Fin.zero_mul'
+ mul_zero := Fin.mul_zero' }
#align fin.comm_ring Fin.instCommRing
/-- Note this is more general than `fin.comm_ring` as it applies (vacuously) to `fin 0` too. -/
@@ -2,16 +2,13 @@
Copyright (c) 2022 Eric Rodriguez. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Rodriguez
-
-! This file was ported from Lean 3 source module data.zmod.defs
-! leanprover-community/mathlib commit 3a2b5524a138b5d0b818b858b516d4ac8a484b03
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Algebra.NeZero
import Mathlib.Data.Nat.ModEq
import Mathlib.Data.Fintype.Lattice
+#align_import data.zmod.defs from "leanprover-community/mathlib"@"3a2b5524a138b5d0b818b858b516d4ac8a484b03"
+
/-!
# Definition of `ZMod n` + basic results.
This also #align
s some nearby instance names
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Rodriguez
! This file was ported from Lean 3 source module data.zmod.defs
-! leanprover-community/mathlib commit 1126441d6bccf98c81214a0780c73d499f6721fe
+! leanprover-community/mathlib commit 3a2b5524a138b5d0b818b858b516d4ac8a484b03
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -46,7 +46,7 @@ to register the ring structure on `ZMod n` as type class instance.
open Nat.ModEq Int
/-- Multiplicative commutative semigroup structure on `Fin n`. -/
-instance (n : ℕ) : CommSemigroup (Fin n) :=
+instance instCommSemigroup (n : ℕ) : CommSemigroup (Fin n) :=
{ inferInstanceAs (Mul (Fin n)) with
mul_assoc := fun ⟨a, ha⟩ ⟨b, hb⟩ ⟨c, hc⟩ =>
Fin.eq_of_veq <|
@@ -55,6 +55,7 @@ instance (n : ℕ) : CommSemigroup (Fin n) :=
_ ≡ a * (b * c) [MOD n] := by rw [mul_assoc]
_ ≡ a * (b * c % n) [MOD n] := (Nat.mod_modEq _ _).symm.mul_left _
mul_comm := Fin.mul_comm }
+#align fin.comm_semigroup Fin.instCommSemigroup
private theorem left_distrib_aux (n : ℕ) : ∀ a b c : Fin n, a * (b + c) = a * b + a * c :=
fun ⟨a, ha⟩ ⟨b, hb⟩ ⟨c, hc⟩ =>
@@ -65,18 +66,30 @@ private theorem left_distrib_aux (n : ℕ) : ∀ a b c : Fin n, a * (b + c) = a
_ ≡ a * b % n + a * c % n [MOD n] := (Nat.mod_modEq _ _).symm.add (Nat.mod_modEq _ _).symm
/-- Commutative ring structure on `Fin n`. -/
-instance (n : ℕ) [NeZero n] : CommRing (Fin n) :=
- { Fin.instAddMonoidWithOneFin n, Fin.addCommGroup n,
- Fin.instCommSemigroupFin n with
- one_mul := Fin.one_mul
- mul_one := Fin.mul_one
+instance instDistrib (n : ℕ) : Distrib (Fin n) :=
+ { Fin.addCommSemigroup n, Fin.instCommSemigroup n with
left_distrib := left_distrib_aux n
right_distrib := fun a b c => by
- rw [mul_comm, left_distrib_aux, mul_comm _ b, mul_comm],
+ rw [mul_comm, left_distrib_aux, mul_comm _ b, mul_comm] }
+#align fin.distrib Fin.instDistrib
+
+/-- Commutative ring structure on `fin n`. -/
+instance instCommRing (n : ℕ) [NeZero n] : CommRing (Fin n) :=
+ { Fin.instAddMonoidWithOne n, Fin.addCommGroup n, Fin.instCommSemigroup n, Fin.instDistrib n with
+ one_mul := Fin.one_mul
+ mul_one := Fin.mul_one,
-- porting note: new, see
-- https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/ring.20vs.20Ring/near/322876462
zero_mul := Fin.zero_mul
mul_zero := Fin.mul_zero }
+#align fin.comm_ring Fin.instCommRing
+
+/-- Note this is more general than `fin.comm_ring` as it applies (vacuously) to `fin 0` too. -/
+instance instHasDistribNeg (n : ℕ) : HasDistribNeg (Fin n) :=
+ { toInvolutiveNeg := Fin.instInvolutiveNeg n
+ mul_neg := Nat.casesOn n finZeroElim fun _i => mul_neg
+ neg_mul := Nat.casesOn n finZeroElim fun _i => neg_mul }
+#align fin.has_distrib_neg Fin.instHasDistribNeg
end Fin
I ran codespell Mathlib
and got tired halfway through the suggestions.
@@ -38,7 +38,7 @@ namespace Fin
## Ring structure on `Fin n`
We define a commutative ring structure on `Fin n`.
-Afterwords, when we define `ZMod n` in terms of `Fin n`, we use these definitions
+Afterwards, when we define `ZMod n` in terms of `Fin n`, we use these definitions
to register the ring structure on `ZMod n` as type class instance.
-/
fix-comments.py
on all files.@@ -45,7 +45,7 @@ to register the ring structure on `ZMod n` as type class instance.
open Nat.ModEq Int
-/-- Multiplicative commutative semigroup structure on `fin n`. -/
+/-- Multiplicative commutative semigroup structure on `Fin n`. -/
instance (n : ℕ) : CommSemigroup (Fin n) :=
{ inferInstanceAs (Mul (Fin n)) with
mul_assoc := fun ⟨a, ha⟩ ⟨b, hb⟩ ⟨c, hc⟩ =>
congr!
and convert
(#2606)
congr!
, convert
, and convert_to
to control parts of the congruence algorithm, in particular transparency settings when applying congruence lemmas.congr!
now applies congruence lemmas with reducible transparency by default. This prevents it from unfolding definitions when applying congruence lemmas. It also now tries both the LHS-biased and RHS-biased simp congruence lemmas, with a configuration option to set which it should try first.HEq
congruence lemma generator that gives each hypothesis access to the proofs of previous hypotheses. This means that if you have an equality ⊢ ⟨a, x⟩ = ⟨b, y⟩
of sigma types, congr!
turns this into goals ⊢ a = b
and ⊢ a = b → HEq x y
(note that congr!
will also auto-introduce a = b
for you in the second goal). This congruence lemma generator applies to more cases than the simp congruence lemma generator does.congr!
(and hence convert
) are more careful about applying lemmas that don't force definitions to unfold. There were a number of cases in mathlib where the implementation of congr
was being abused to unfold definitions.set_option trace.congr! true
you can see what congr!
sees when it is deciding on congruence lemmas.convert_to
to do using 1
when there is no using
clause, to match its documentation.Note that congr!
is more capable than congr
at finding a way to equate left-hand sides and right-hand sides, so you will frequently need to limit its depth with a using
clause. However, there is also a new heuristic to prevent considering unlikely-to-be-provable type equalities (controlled by the typeEqs
option), which can help limit the depth automatically.
There is also a predefined configuration that you can invoke with, for example, convert (config := .unfoldSameFun) h
, that causes it to behave more like congr
, including using default transparency when unfolding.
@@ -111,7 +111,7 @@ instance infinite : Infinite (ZMod 0) :=
theorem card (n : ℕ) [Fintype (ZMod n)] : Fintype.card (ZMod n) = n := by
cases n with
| zero => exact (not_finite (ZMod 0)).elim
- | succ n => convert Fintype.card_fin (n + 1)
+ | succ n => convert Fintype.card_fin (n + 1) using 2
#align zmod.card ZMod.card
/- We define each field by cases, to ensure that the eta-expanded `ZMod.commRing` is defeq to the
congr!
and improvement to convert
(#2566)
This introduces a tactic congr!
that is an analogue to mathlib 3's congr'
. It is a more insistent version of congr
that makes use of more congruence lemmas (including user congruence lemmas), propext
, funext
, and Subsingleton
instances. It also has a feature to lift reflexive relations to equalities. Along with funext
, the tactic does intros
, allowing congr!
to get access to function bodies; the introduced variables can be named using rename_i
if needed.
This also modifies convert
to use congr!
rather than congr
, which makes it work more like the mathlib3 version of the tactic.
@@ -111,7 +111,7 @@ instance infinite : Infinite (ZMod 0) :=
theorem card (n : ℕ) [Fintype (ZMod n)] : Fintype.card (ZMod n) = n := by
cases n with
| zero => exact (not_finite (ZMod 0)).elim
- | succ n => convert Fintype.card_fin (n + 1); apply Subsingleton.elim
+ | succ n => convert Fintype.card_fin (n + 1)
#align zmod.card ZMod.card
/- We define each field by cases, to ensure that the eta-expanded `ZMod.commRing` is defeq to the
@@ -50,7 +50,6 @@ instance (n : ℕ) : CommSemigroup (Fin n) :=
{ inferInstanceAs (Mul (Fin n)) with
mul_assoc := fun ⟨a, ha⟩ ⟨b, hb⟩ ⟨c, hc⟩ =>
Fin.eq_of_veq <|
- show _ ≡ _ [MOD _] from -- lean4#2073
calc
a * b % n * c ≡ a * b * c [MOD n] := (Nat.mod_modEq _ _).mul_right _
_ ≡ a * (b * c) [MOD n] := by rw [mul_assoc]
@@ -60,7 +59,6 @@ instance (n : ℕ) : CommSemigroup (Fin n) :=
private theorem left_distrib_aux (n : ℕ) : ∀ a b c : Fin n, a * (b + c) = a * b + a * c :=
fun ⟨a, ha⟩ ⟨b, hb⟩ ⟨c, hc⟩ =>
Fin.eq_of_veq <|
- show _ ≡ _ [MOD _] from -- lean4#2073
calc
a * ((b + c) % n) ≡ a * (b + c) [MOD n] := (Nat.mod_modEq _ _).mul_left _
_ ≡ a * b + a * c [MOD n] := by rw [mul_add]
Drop
by delta mydef; infer_instance
. This generates id _
in the proof.
show _, by infer_instance
. This generates let
in let
; not sure if it's bad for defeq but a reducible inferInstanceAs
should not be worse.
@@ -89,8 +89,8 @@ def ZMod : ℕ → Type
#align zmod ZMod
instance ZMod.decidableEq : ∀ n : ℕ, DecidableEq (ZMod n)
- | 0 => by dsimp [ZMod]; infer_instance
- | n + 1 => by dsimp [ZMod]; infer_instance
+ | 0 => inferInstanceAs (DecidableEq ℤ)
+ | n + 1 => inferInstanceAs (DecidableEq (Fin (n + 1)))
#align zmod.decidable_eq ZMod.decidableEq
instance ZMod.repr : ∀ n : ℕ, Repr (ZMod n)
@@ -49,22 +49,22 @@ open Nat.ModEq Int
instance (n : ℕ) : CommSemigroup (Fin n) :=
{ inferInstanceAs (Mul (Fin n)) with
mul_assoc := fun ⟨a, ha⟩ ⟨b, hb⟩ ⟨c, hc⟩ =>
- Fin.eq_of_veq
- (calc
+ Fin.eq_of_veq <|
+ show _ ≡ _ [MOD _] from -- lean4#2073
+ calc
a * b % n * c ≡ a * b * c [MOD n] := (Nat.mod_modEq _ _).mul_right _
_ ≡ a * (b * c) [MOD n] := by rw [mul_assoc]
_ ≡ a * (b * c % n) [MOD n] := (Nat.mod_modEq _ _).symm.mul_left _
- )
mul_comm := Fin.mul_comm }
private theorem left_distrib_aux (n : ℕ) : ∀ a b c : Fin n, a * (b + c) = a * b + a * c :=
fun ⟨a, ha⟩ ⟨b, hb⟩ ⟨c, hc⟩ =>
- Fin.eq_of_veq
- (calc
+ Fin.eq_of_veq <|
+ show _ ≡ _ [MOD _] from -- lean4#2073
+ calc
a * ((b + c) % n) ≡ a * (b + c) [MOD n] := (Nat.mod_modEq _ _).mul_left _
_ ≡ a * b + a * c [MOD n] := by rw [mul_add]
_ ≡ a * b % n + a * c % n [MOD n] := (Nat.mod_modEq _ _).symm.add (Nat.mod_modEq _ _).symm
- )
/-- Commutative ring structure on `Fin n`. -/
instance (n : ℕ) [NeZero n] : CommRing (Fin n) :=
The unported dependencies are