Clifford project

3. Symplectic form🔗

Throughout this section we assume that \mathsf{R} is a commutative Ring.

Lean codevariable {R : Type} [CommRing R]

Below we define the symplectic inner product or symplectic form on \mathsf{R}.

Definition3.1
Group: Basic properties of the symplectic inner product. (8)
Group member previews
Preview
Lemma 3.2
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 0
Used by 5
Reverse dependency previews
Preview
Lemma 5.3
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
✓L∃∀N

The symplectic inner product of \p = (p_1, p_2) and \q = (q_1, q_2) in ℤ_d^2 is \braket{\p,\q} := p_2 q_1 - p_1 q_2.

Lean code for Definition3.1def symp {R : Type*} [CommRing R] (p q : R × R) : R := p.2 * q.1 - p.1 * q.2 notation "⟨" a "," b "⟩" => symp a b

The symplectic inner product is antisymmetric.

Lemma3.2
Group: Basic properties of the symplectic inner product. (8)
Group member previews
Preview
Definition 3.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 0
Used by 3
Reverse dependency previews
Preview
Theorem 7.1
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
✓L∃∀N

For all \p,\q ∈ ℤ_d^2, \braket{\p,\q} = -\braket{\q,\p}.

Proof for Lemma 3.2
uses 0

\braket{\p,\q} = p_2 q_1 - p_1 q_2 = - (q_2 p_1 - q_1 p_2) = -\braket{\q,\p}.

Lean code for Lemma3.2lemma symp_antisymmetric (p q : R × R) : ⟨p, q⟩ = -⟨q, p⟩ := R:Typeinst✝:CommRing Rp:R × Rq:R × R⊢ ⟨p,q⟩ = -⟨q,p⟩ R:Typeinst✝:CommRing Rp:R × Rq:R × R⊢ p.2 * q.1 - p.1 * q.2 = -(q.2 * p.1 - q.1 * p.2); All goals completed! 🐙

Every vector is isotropic under the symplectic inner product.

Lemma3.3
Group: Basic properties of the symplectic inner product. (8)
Group member previews
Preview
Definition 3.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 0
Used by 2
Reverse dependency previews
Preview
Lemma 5.4
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
✓L∃∀N

For any \p ∈ ℤ_d^2, \braket{\p,\p} = 0.

Proof for Lemma 3.3
uses 0

\braket{\p,\p} = p_2 p_1 - p_1 p_2 = 0.

Lean code for Lemma3.3@[simp] lemma self_eq_zero (p : R × R) : ⟨p, p⟩ = 0 := R:Typeinst✝:CommRing Rp:R × R⊢ ⟨p,p⟩ = 0 R:Typeinst✝:CommRing Rp:R × R⊢ p.2 * p.1 - p.1 * p.2 = 0; All goals completed! 🐙

The symplectic inner product is additive in the first and second argument.

Lemma3.4
Group: Basic properties of the symplectic inner product. (8)
Group member previews
Preview
Definition 3.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 0used by 1✓L∃∀N

For all \p, \p', \q ∈ ℤ_d^2, \braket{\p + \p', \q} = \braket{\p,\q} + \braket{\p',\q}.

Lean code for Lemma3.4@[simp] lemma symp_add_left (p p' q : R × R) : ⟨p + p', q⟩ = ⟨p, q⟩ + ⟨p', q⟩ := R:Typeinst✝:CommRing Rp:R × Rp':R × Rq:R × R⊢ ⟨p + p',q⟩ = ⟨p,q⟩ + ⟨p',q⟩ R:Typeinst✝:CommRing Rp:R × Rp':R × Rq:R × R⊢ (p + p').2 * q.1 - (p + p').1 * q.2 = p.2 * q.1 - p.1 * q.2 + (p'.2 * q.1 - p'.1 * q.2); R:Typeinst✝:CommRing Rp:R × Rp':R × Rq:R × R⊢ (p.2 + p'.2) * q.1 - (p.1 + p'.1) * q.2 = p.2 * q.1 - p.1 * q.2 + (p'.2 * q.1 - p'.1 * q.2); All goals completed! 🐙
Lemma3.5
Group: Basic properties of the symplectic inner product. (8)
Group member previews
Preview
Definition 3.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 0used by 0✓L∃∀N

For all \p, \q, \q' ∈ ℤ_d^2, \braket{\p, \q + \q'} = \braket{\p,\q} + \braket{\p,\q'}.

Lean code for Lemma3.5@[simp] lemma symp_add_right (p q q' : R × R) : ⟨p, (q + q')⟩ = ⟨p, q ⟩ + ⟨p, q'⟩ := R:Typeinst✝:CommRing Rp:R × Rq:R × Rq':R × R⊢ ⟨p,q + q'⟩ = ⟨p,q⟩ + ⟨p,q'⟩ R:Typeinst✝:CommRing Rp:R × Rq:R × Rq':R × R⊢ p.2 * (q + q').1 - p.1 * (q + q').2 = p.2 * q.1 - p.1 * q.2 + (p.2 * q'.1 - p.1 * q'.2); R:Typeinst✝:CommRing Rp:R × Rq:R × Rq':R × R⊢ p.2 * (q.1 + q'.1) - p.1 * (q.2 + q'.2) = p.2 * q.1 - p.1 * q.2 + (p.2 * q'.1 - p.1 * q'.2); All goals completed! 🐙

Constants can be pulled out of the first and second argument.

Lemma3.6
Group: Basic properties of the symplectic inner product. (8)
Group member previews
Preview
Definition 3.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 0used by 0✓L∃∀N

For all c ∈ ℤ_d and \p, \q ∈ ℤ_d^2, \braket{c\p, \q} = c\braket{\p,\q}.

Lean code for Lemma3.6@[simp] lemma symp_smul_left (c : R) (p q : R × R) : ⟨(c • p), q⟩ = c * ⟨p, q⟩ := R:Typeinst✝:CommRing Rc:Rp:R × Rq:R × R⊢ ⟨c • p,q⟩ = c * ⟨p,q⟩ R:Typeinst✝:CommRing Rc:Rp:R × Rq:R × R⊢ (c • p).2 * q.1 - (c • p).1 * q.2 = c * (p.2 * q.1 - p.1 * q.2); R:Typeinst✝:CommRing Rc:Rp:R × Rq:R × R⊢ c * p.2 * q.1 - c * p.1 * q.2 = c * (p.2 * q.1 - p.1 * q.2); All goals completed! 🐙
Lemma3.7
Group: Basic properties of the symplectic inner product. (8)
Group member previews
Preview
Definition 3.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 0used by 1✓L∃∀N

For all c ∈ ℤ_d and \p, \q ∈ ℤ_d^2, \braket{\p, c\q} = c\braket{\p,\q}.

Lean code for Lemma3.7@[simp] lemma symp_smul_right (c : R) (p q : R × R) : ⟨p, (c • q)⟩ = c * ⟨p, q⟩ := R:Typeinst✝:CommRing Rc:Rp:R × Rq:R × R⊢ ⟨p,c • q⟩ = c * ⟨p,q⟩ R:Typeinst✝:CommRing Rc:Rp:R × Rq:R × R⊢ p.2 * (c • q).1 - p.1 * (c • q).2 = c * (p.2 * q.1 - p.1 * q.2); R:Typeinst✝:CommRing Rc:Rp:R × Rq:R × R⊢ p.2 * (c * q.1) - p.1 * (c * q.2) = c * (p.2 * q.1 - p.1 * q.2); All goals completed! 🐙

If both arguments of the symplectic inner product are transformed by a linear map F, the value gets multiplied by \det F. We first rely on the usual coercion between tuples and two-dimensional vectors to define Matrix multiplication over \mathsf{R}^2

Lean code@[simp] def pair_apply_mat (F : Matrix (Fin 2) (Fin 2) R) (p : R × R) : R × R := F.mulVec p @[simp] lemma pair_apply_mat_alg (F : Matrix (Fin 2) (Fin 2) R) (p : R × R) : pair_apply_mat F p = ((F 0 0) * p.1 + (F 0 1) * p.2, (F 1 0) * p.1 + (F 1 1) * p.2) := R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × R⊢ pair_apply_mat F p = (F 0 0 * p.1 + F 0 1 * p.2, F 1 0 * p.1 + F 1 1 * p.2) R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × R⊢ F.mulVec ![p.1, p.2] 0 = F 0 0 * p.1 + F 0 1 * p.2 ∧ F.mulVec ![p.1, p.2] 1 = F 1 0 * p.1 + F 1 1 * p.2; R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × R⊢ ∑ j, F 0 j * ![p.1, p.2] j = F 0 0 * p.1 + F 0 1 * p.2 ∧ F.mulVec ![p.1, p.2] 1 = F 1 0 * p.1 + F 1 1 * p.2; R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × R⊢ F.mulVec ![p.1, p.2] 1 = F 1 0 * p.1 + F 1 1 * p.2; R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × R⊢ ∑ j, F 1 j * ![p.1, p.2] j = F 1 0 * p.1 + F 1 1 * p.2; All goals completed! 🐙
Lemma3.8
Group: Basic properties of the symplectic inner product. (8)
Group member previews
Preview
Definition 3.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 0used by 1✓L∃∀N

For any matrix F \in \mathrm{M}_2(ℤ_d) and vectors \p, \q \in ℤ_d^2, \langle F\p, F\q \rangle = (\det F) \langle \p, \q \rangle.

Proof for Lemma 3.8
uses 0

If F = \bigl(\begin{smallmatrix} \alpha & \beta \\ \gamma & \delta \end{smallmatrix}\bigr) and \p = (p_1, \, p_2)^T then F\p = (\alpha p_1 + \beta p_2, \, \gamma p_1 + \delta p_2)^T. After applying F the symplectic inner product evaluates to \begin{aligned} \langle F\p, F\q\rangle &= (\gamma p_1 + \delta p_2)(\alpha q_1 + \beta q_2) - (\alpha p_1 + \beta p_2)(\gamma q_1 + \delta q_2) \\ &= (\alpha\delta - \beta\gamma)(p_2 q_1 - p_1 q_2) \\ &= (\det F)\langle \p, \q\rangle. \end{aligned}

Lean code for Lemma3.8lemma symp_det (F : Matrix (Fin 2) (Fin 2) R) (p q : R × R) : ⟨(pair_apply_mat F p), (pair_apply_mat F q)⟩ = Matrix.det F * ⟨p, q⟩ := R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × Rq:R × R⊢ ⟨pair_apply_mat F p,pair_apply_mat F q⟩ = F.det * ⟨p,q⟩ calc symp (pair_apply_mat F p) (pair_apply_mat F q) = symp ((F 0 0) * p.1 + (F 0 1) * p.2, (F 1 0) * p.1 + (F 1 1) * p.2) ((F 0 0) * q.1 + (F 0 1) * q.2, (F 1 0) * q.1 + (F 1 1) * q.2) := R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × Rq:R × R⊢ ⟨pair_apply_mat F p,pair_apply_mat F q⟩ = ⟨(F 0 0 * p.1 + F 0 1 * p.2, F 1 0 * p.1 + F 1 1 * p.2),(F 0 0 * q.1 + F 0 1 * q.2, F 1 0 * q.1 + F 1 1 * q.2)⟩ All goals completed! 🐙; _ = (((F 1 0) * p.1 + (F 1 1) * p.2) * ((F 0 0) * q.1 + (F 0 1) * q.2)) - (((F 1 0) * q.1 + (F 1 1) * q.2) * ((F 0 0) * p.1 + (F 0 1) * p.2)) := R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × Rq:R × R⊢ ⟨(F 0 0 * p.1 + F 0 1 * p.2, F 1 0 * p.1 + F 1 1 * p.2),(F 0 0 * q.1 + F 0 1 * q.2, F 1 0 * q.1 + F 1 1 * q.2)⟩ = (F 1 0 * p.1 + F 1 1 * p.2) * (F 0 0 * q.1 + F 0 1 * q.2) - (F 1 0 * q.1 + F 1 1 * q.2) * (F 0 0 * p.1 + F 0 1 * p.2) R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × Rq:R × R⊢ (F 0 0 * p.1 + F 0 1 * p.2, F 1 0 * p.1 + F 1 1 * p.2).2 * (F 0 0 * q.1 + F 0 1 * q.2, F 1 0 * q.1 + F 1 1 * q.2).1 - (F 0 0 * p.1 + F 0 1 * p.2, F 1 0 * p.1 + F 1 1 * p.2).1 * (F 0 0 * q.1 + F 0 1 * q.2, F 1 0 * q.1 + F 1 1 * q.2).2 = (F 1 0 * p.1 + F 1 1 * p.2) * (F 0 0 * q.1 + F 0 1 * q.2) - (F 1 0 * q.1 + F 1 1 * q.2) * (F 0 0 * p.1 + F 0 1 * p.2); R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × Rq:R × R⊢ (F 0 0 * p.1 + F 0 1 * p.2) * (F 1 0 * q.1 + F 1 1 * q.2) = (F 1 0 * q.1 + F 1 1 * q.2) * (F 0 0 * p.1 + F 0 1 * p.2); All goals completed! 🐙 _ = ((F 0 0) * (F 1 1) - (F 1 0) * (F 0 1)) * (p.2 * q.1 - p.1 * q.2 ) := R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × Rq:R × R⊢ (F 1 0 * p.1 + F 1 1 * p.2) * (F 0 0 * q.1 + F 0 1 * q.2) - (F 1 0 * q.1 + F 1 1 * q.2) * (F 0 0 * p.1 + F 0 1 * p.2) = (F 0 0 * F 1 1 - F 1 0 * F 0 1) * (p.2 * q.1 - p.1 * q.2) All goals completed! 🐙 _ = (Matrix.det F) * (symp p q) := R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × Rq:R × R⊢ (F 0 0 * F 1 1 - F 1 0 * F 0 1) * (p.2 * q.1 - p.1 * q.2) = F.det * ⟨p,q⟩ R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × Rq:R × R⊢ F.det * ⟨p,q⟩ = (F 0 0 * F 1 1 - F 1 0 * F 0 1) * (p.2 * q.1 - p.1 * q.2); R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × Rq:R × R⊢ F.det * (p.2 * q.1 - p.1 * q.2) = (F 0 0 * F 1 1 - F 1 0 * F 0 1) * (p.2 * q.1 - p.1 * q.2); R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) Rp:R × Rq:R × R⊢ (F 0 0 * F 1 1 - F 0 1 * F 1 0) * (p.2 * q.1 - p.1 * q.2) = (F 0 0 * F 1 1 - F 1 0 * F 0 1) * (p.2 * q.1 - p.1 * q.2); All goals completed! 🐙

Adjoint property of the symplectic inner product. Properties on matrices of the Special Linear Group

Lean codedef SpecialLinearInverse (F : Matrix.SpecialLinearGroup (Fin 2) R) : Matrix.SpecialLinearGroup (Fin 2) R := Matrix.SpecialLinearGroup.hasInv.inv F lemma MatrixMulToDoubleApply (F G : Matrix (Fin 2) (Fin 2) R) (p : R × R) : pair_apply_mat F (pair_apply_mat G p) = pair_apply_mat (F * G) p := R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) RG:Matrix (Fin 2) (Fin 2) Rp:R × R⊢ pair_apply_mat F (pair_apply_mat G p) = pair_apply_mat (F * G) p R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) RG:Matrix (Fin 2) (Fin 2) Rp:R × R⊢ (F.mulVec ![(G.mulVec ![p.1, p.2] 0, G.mulVec ![p.1, p.2] 1).1, (G.mulVec ![p.1, p.2] 0, G.mulVec ![p.1, p.2] 1).2] 0, F.mulVec ![(G.mulVec ![p.1, p.2] 0, G.mulVec ![p.1, p.2] 1).1, (G.mulVec ![p.1, p.2] 0, G.mulVec ![p.1, p.2] 1).2] 1) = ((F * G).mulVec ![p.1, p.2] 0, (F * G).mulVec ![p.1, p.2] 1); R:Typeinst✝:CommRing RF:Matrix (Fin 2) (Fin 2) RG:Matrix (Fin 2) (Fin 2) Rp:R × R⊢ (F.mulVec ![(G.mulVec ![p.1, p.2] 0, G.mulVec ![p.1, p.2] 1).1, (G.mulVec ![p.1, p.2] 0, G.mulVec ![p.1, p.2] 1).2] 0, F.mulVec ![(G.mulVec ![p.1, p.2] 0, G.mulVec ![p.1, p.2] 1).1, (G.mulVec ![p.1, p.2] 0, G.mulVec ![p.1, p.2] 1).2] 1) = (F.mulVec (G.mulVec ![p.1, p.2]) 0, F.mulVec (G.mulVec ![p.1, p.2]) 1); All goals completed! 🐙 @[simp] lemma SpecialLinearDet (F : Matrix.SpecialLinearGroup (Fin 2) R): Matrix.det (CoeFun.coe F) = 1 := R:Typeinst✝:CommRing RF:Matrix.SpecialLinearGroup (Fin 2) R⊢ Matrix.det (CoeFun.coe F) = 1 All goals completed! 🐙 lemma FactorByInverse (F : Matrix.SpecialLinearGroup (Fin 2) R) (p : R × R) : pair_apply_mat ↑((F * F⁻¹) : Matrix.SpecialLinearGroup (Fin 2) R) p = p := R:Typeinst✝:CommRing RF:Matrix.SpecialLinearGroup (Fin 2) Rp:R × R⊢ pair_apply_mat (↑(F * F⁻¹)) p = p R:Typeinst✝:CommRing RF:Matrix.SpecialLinearGroup (Fin 2) Rp:R × R⊢ pair_apply_mat (↑1) p = p; All goals completed! 🐙
Lemma3.9
Group: Basic properties of the symplectic inner product. (8)
Group member previews
Preview
Definition 3.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 0used by 1✓L∃∀N

If F ∈ \SL(2,ℤ_d) then \braket{\p,F\q} \equiv \braket{F^{-1}\p,\q} \pmod{d} for all \p,\q ∈ ℤ.

Proof for Lemma 3.9
uses 0

Since F is invertible, one can write p = FF^{-1}p. Hence, \begin{align*} \langle p, F q \rangle &= \langle FF^{-1}p , F q \rangle \\ &= (\det F) \langle F^{-1}p, q \rangle\\ &=\langle F^{-1}p, q \rangle \end{align*}

Lean code for Lemma3.9lemma symp_adjoint (F : Matrix.SpecialLinearGroup (Fin 2) R) (p q : R × R) : (⟨p, (pair_apply_mat F q)⟩) = (⟨(pair_apply_mat (SpecialLinearInverse F) p), q⟩) := R:Typeinst✝:CommRing RF:Matrix.SpecialLinearGroup (Fin 2) Rp:R × Rq:R × R⊢ ⟨p,pair_apply_mat (↑F) q⟩ = ⟨pair_apply_mat (↑(SpecialLinearInverse F)) p,q⟩ calc ⟨p, (pair_apply_mat F q)⟩ = ⟨ (pair_apply_mat ((F * (SpecialLinearInverse F)) : Matrix.SpecialLinearGroup (Fin 2) R) p) , (pair_apply_mat F q)⟩ := R:Typeinst✝:CommRing RF:Matrix.SpecialLinearGroup (Fin 2) Rp:R × Rq:R × R⊢ ⟨p,pair_apply_mat (↑F) q⟩ = ⟨pair_apply_mat (↑(F * SpecialLinearInverse F)) p,pair_apply_mat (↑F) q⟩ R:Typeinst✝:CommRing RF:Matrix.SpecialLinearGroup (Fin 2) Rp:R × Rq:R × R⊢ ⟨pair_apply_mat (↑(F * SpecialLinearInverse F)) p,pair_apply_mat (↑F) q⟩ = ⟨p,pair_apply_mat (↑F) q⟩; R:Typeinst✝:CommRing RF:Matrix.SpecialLinearGroup (Fin 2) Rp:R × Rq:R × R⊢ ⟨pair_apply_mat (↑(F * F⁻¹)) p,pair_apply_mat (↑F) q⟩ = ⟨p,pair_apply_mat (↑F) q⟩; All goals completed! 🐙 _ = (Matrix.det (Matrix.SpecialLinearGroup.instCoeFun.coe F)) * symp (pair_apply_mat (SpecialLinearInverse F) p) q := R:Typeinst✝:CommRing RF:Matrix.SpecialLinearGroup (Fin 2) Rp:R × Rq:R × R⊢ ⟨pair_apply_mat (↑(F * SpecialLinearInverse F)) p,pair_apply_mat (↑F) q⟩ = Matrix.det (CoeFun.coe F) * ⟨pair_apply_mat (↑(SpecialLinearInverse F)) p,q⟩ R:Typeinst✝:CommRing RF:Matrix.SpecialLinearGroup (Fin 2) Rp:R × Rq:R × R⊢ ⟨pair_apply_mat (↑F * ↑(SpecialLinearInverse F)) p,pair_apply_mat (↑F) q⟩ = Matrix.det (CoeFun.coe F) * ⟨pair_apply_mat (↑(SpecialLinearInverse F)) p,q⟩; R:Typeinst✝:CommRing RF:Matrix.SpecialLinearGroup (Fin 2) Rp:R × Rq:R × R⊢ ⟨pair_apply_mat (↑F) (pair_apply_mat (↑(SpecialLinearInverse F)) p),pair_apply_mat (↑F) q⟩ = Matrix.det (CoeFun.coe F) * ⟨pair_apply_mat (↑(SpecialLinearInverse F)) p,q⟩; All goals completed! 🐙 _ = symp (pair_apply_mat (SpecialLinearInverse F) p) q := R:Typeinst✝:CommRing RF:Matrix.SpecialLinearGroup (Fin 2) Rp:R × Rq:R × R⊢ Matrix.det (CoeFun.coe F) * ⟨pair_apply_mat (↑(SpecialLinearInverse F)) p,q⟩ = ⟨pair_apply_mat (↑(SpecialLinearInverse F)) p,q⟩ R:Typeinst✝:CommRing RF:Matrix.SpecialLinearGroup (Fin 2) Rp:R × Rq:R × R⊢ 1 * ⟨pair_apply_mat (↑(SpecialLinearInverse F)) p,q⟩ = ⟨pair_apply_mat (↑(SpecialLinearInverse F)) p,q⟩; All goals completed! 🐙