Library HoTT.Algebra.Rings.Idempotent
Require Import Basics.Overture Basics.Tactics Basics.PathGroupoids.
Require Import Basics.Equivalences Basics.Trunc Types.Sigma WildCat.Core.
Require Import Nat.Core Rings.Ring.
Local Open Scope mc_scope.
Require Import Basics.Equivalences Basics.Trunc Types.Sigma WildCat.Core.
Require Import Nat.Core Rings.Ring.
Local Open Scope mc_scope.
Class IsIdempotent (R : Ring) (e : R)
:= rng_idem : e × e = e.
Global Instance ishprop_isidempotent R e : IsHProp (IsIdempotent R e).
Proof.
unfold IsIdempotent; exact _.
Defined.
One is idempotent.
Global Instance isidempotent_complement (R : Ring) (e : R) `{IsIdempotent R e}
: IsIdempotent R (1 - e).
Proof.
unfold IsIdempotent.
rewrite rng_dist_l_negate.
rewrite 2 rng_dist_r_negate.
rewrite 2 rng_mult_one_l.
rewrite rng_mult_one_r.
rewrite rng_idem.
rewrite rng_plus_negate_r.
rewrite rng_negate_zero.
nrapply rng_plus_zero_r.
Defined.
: IsIdempotent R (1 - e).
Proof.
unfold IsIdempotent.
rewrite rng_dist_l_negate.
rewrite 2 rng_dist_r_negate.
rewrite 2 rng_mult_one_l.
rewrite rng_mult_one_r.
rewrite rng_idem.
rewrite rng_plus_negate_r.
rewrite rng_negate_zero.
nrapply rng_plus_zero_r.
Defined.
If e is idempotent, then it is also an idempotent element of the opposite ring.
Global Instance isidempotent_op (R : Ring) (e : R) `{i : IsIdempotent R e}
: IsIdempotent (rng_op R) e
:= i.
: IsIdempotent (rng_op R) e
:= i.
Definition rng_power_idem {R : Ring} (e : R) `{IsIdempotent R e} (n : nat)
: (1 ≤ n)%nat → rng_power e n = e.
Proof.
intros L; induction L.
- snrapply rng_mult_one_r.
- rhs_V rapply rng_idem.
exact (ap (e *.) IHL).
Defined.
: (1 ≤ n)%nat → rng_power e n = e.
Proof.
intros L; induction L.
- snrapply rng_mult_one_r.
- rhs_V rapply rng_idem.
exact (ap (e *.) IHL).
Defined.
Ring homomorphisms preserve idempotent elements.
Global Instance isidempotent_rng_homo {R S : Ring} (f : R $-> S) (e : R)
: IsIdempotent R e → IsIdempotent S (f e).
Proof.
intros p.
lhs_V nrapply rng_homo_mult.
exact (ap f p).
Defined.
: IsIdempotent R e → IsIdempotent S (f e).
Proof.
intros p.
lhs_V nrapply rng_homo_mult.
exact (ap f p).
Defined.
Orthogonal idempotent elements
Class IsOrthogonal (R : Ring) (e f : R)
`{!IsIdempotent R e, !IsIdempotent R f} := {
rng_idem_orth : e × f = 0 ;
rng_idem_orth' : f × e = 0 ;
}.
Definition issig_IsOrthogonal {R : Ring} {e f : R}
`{IsIdempotent R e, IsIdempotent R f}
: _ <~> IsOrthogonal R e f
:= ltac:(issig).
Global Instance ishprop_isorthogonal R e f
`{IsIdempotent R e, IsIdempotent R f}
: IsHProp (IsOrthogonal R e f).
Proof.
exact (istrunc_equiv_istrunc _ issig_IsOrthogonal).
Defined.
`{!IsIdempotent R e, !IsIdempotent R f} := {
rng_idem_orth : e × f = 0 ;
rng_idem_orth' : f × e = 0 ;
}.
Definition issig_IsOrthogonal {R : Ring} {e f : R}
`{IsIdempotent R e, IsIdempotent R f}
: _ <~> IsOrthogonal R e f
:= ltac:(issig).
Global Instance ishprop_isorthogonal R e f
`{IsIdempotent R e, IsIdempotent R f}
: IsHProp (IsOrthogonal R e f).
Proof.
exact (istrunc_equiv_istrunc _ issig_IsOrthogonal).
Defined.
Definition isorthogonal_swap (R : Ring) (e f : R) `{IsOrthogonal R e f}
: IsOrthogonal R f e
:= {| rng_idem_orth := rng_idem_orth' ; rng_idem_orth' := rng_idem_orth |}.
Hint Immediate isorthogonal_swap : typeclass_instances.
: IsOrthogonal R f e
:= {| rng_idem_orth := rng_idem_orth' ; rng_idem_orth' := rng_idem_orth |}.
Hint Immediate isorthogonal_swap : typeclass_instances.
If e and f are orthogonal idempotents, then they are also orthogonal idempotents in the opposite ring.
Global Instance isorthogonal_op {R : Ring} (e f : R) `{r : IsOrthogonal R e f}
: IsOrthogonal (rng_op R) e f.
Proof.
snrapply Build_IsOrthogonal.
- exact (rng_idem_orth' (R:=R)).
- exact (rng_idem_orth (R:=R)).
Defined.
: IsOrthogonal (rng_op R) e f.
Proof.
snrapply Build_IsOrthogonal.
- exact (rng_idem_orth' (R:=R)).
- exact (rng_idem_orth (R:=R)).
Defined.
Global Instance isidempotent_plus_orthogonal {R : Ring} (e f : R)
`{IsOrthogonal R e f}
: IsIdempotent R (e + f).
Proof.
unfold IsIdempotent.
rewrite rng_dist_l.
rewrite 2 rng_dist_r.
rewrite 2 rng_idem.
rewrite 2 rng_idem_orth.
by rewrite rng_plus_zero_r, rng_plus_zero_l.
Defined.
`{IsOrthogonal R e f}
: IsIdempotent R (e + f).
Proof.
unfold IsIdempotent.
rewrite rng_dist_l.
rewrite 2 rng_dist_r.
rewrite 2 rng_idem.
rewrite 2 rng_idem_orth.
by rewrite rng_plus_zero_r, rng_plus_zero_l.
Defined.
Global Instance isorthogonal_complement {R : Ring} (e : R) `{IsIdempotent R e}
: IsOrthogonal R e (1 - e).
Proof.
snrapply Build_IsOrthogonal.
1: rewrite rng_dist_l_negate,rng_mult_one_r.
2: rewrite rng_dist_r_negate, rng_mult_one_l.
1,2: rewrite rng_idem.
1,2: apply rng_plus_negate_r.
Defined.
: IsOrthogonal R e (1 - e).
Proof.
snrapply Build_IsOrthogonal.
1: rewrite rng_dist_l_negate,rng_mult_one_r.
2: rewrite rng_dist_r_negate, rng_mult_one_l.
1,2: rewrite rng_idem.
1,2: apply rng_plus_negate_r.
Defined.