Clifford project

4. Pauli matrices🔗

This section defines the generalized Pauli X and Z matrices on ℂ^d and proves some basic fats about them. Throughout this section we assume that d ≥ 1.

Lean codevariable (d : ) [NeZero d]

The generalized Pauli X matrix corresponds to adding one modulo d.

Definition4.29
Group: Core properties of the single-qudit Pauli matrices. (8)
Hover another entry in this group to preview it.
L∃∀N
Used by 2
Hover a use site to preview it.
Preview
Definition 5.46
Loading preview
Hover a use site to preview it.

The d-dimensional Pauli X matrix acts as follows: X \ket{k} = \ket{k+1} where k ∈ ℤ_d and addition is modulo d.

Lean code for Definition4.29def X : Matrix (ZMod d) (ZMod d) := Matrix.of fun i j => if j + 1 = i then 1 else 0

Powers of the Pauli X matrix.

Lemma4.30
Group: Core properties of the single-qudit Pauli matrices. (8)
Hover another entry in this group to preview it.
L∃∀Nused by 0

The n-th power of the d-dimensional Pauli X matrix acts on basis vectors as X^n \ket{k} = \ket{k + n \mod d}.

Lean code for Lemma4.30lemma X_pow_pos_n (n : ) : X d ^ n = Matrix.of (fun i j => if j + (n : ZMod d) = i then 1 else 0) := d:inst✝:NeZero dn:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0 induction n with d:inst✝:NeZero dX d ^ 0 = Matrix.of fun i j => if j + 0 = i then 1 else 0 d:inst✝:NeZero di:ZMod dj:ZMod d(X d ^ 0) i j = Matrix.of (fun i j => if j + 0 = i then 1 else 0) i j d:inst✝:NeZero di:ZMod dj:ZMod dhij:i = j j = i(X d ^ 0) i j = Matrix.of (fun i j => if j + 0 = i then 1 else 0) i j All goals completed! 🐙 d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0X d ^ (n + 1) = Matrix.of fun i j => if j + (n + 1) = i then 1 else 0 d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod d(X d ^ (n + 1)) i j = Matrix.of (fun i j => if j + (n + 1) = i then 1 else 0) i j d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod d j_1, Matrix.of (fun i j => if j + n = i then 1 else 0) i j_1 * X d j_1 j = Matrix.of (fun i j => if j + (n + 1) = i then 1 else 0) i j have hfun : (x : ZMod d), x (j + (1 : ZMod d)) X d x j = 0 := d:inst✝:NeZero dn:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0 d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod d (x : ZMod d), x j + 1 Matrix.of (fun i j => if j + 1 = i then 1 else 0) x j = 0 intro x d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dx:ZMod dh:x j + 1Matrix.of (fun i j => if j + 1 = i then 1 else 0) x j = 0 d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dx:ZMod dh:x j + 1¬j + 1 = x d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dx:ZMod dh:x j + 1h':j + 1 = xFalse d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dx:ZMod dh:x j + 1h':x = j + 1False All goals completed! 🐙 have hfun' : (x : ZMod d), x (j + (1 : ZMod d)) Matrix.of (fun i j => if j + (n : ZMod d) = i then 1 else 0) i x * X d x j = 0 := d:inst✝:NeZero dn:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0 intro x d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dhfun: (x : ZMod d), x j + 1 X d x j = 0x:ZMod dh:x j + 1Matrix.of (fun i j => if j + n = i then 1 else 0) i x * X d x j = 0 d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dx:ZMod dh:x j + 1hfun:X d x j = 0Matrix.of (fun i j => if j + n = i then 1 else 0) i x * X d x j = 0 All goals completed! 🐙 d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dhfun: (x : ZMod d), x j + 1 X d x j = 0hfun': (x : ZMod d), x j + 1 Matrix.of (fun i j => if j + n = i then 1 else 0) i x * X d x j = 0Matrix.of (fun i j => if j + n = i then 1 else 0) i (j + 1) * X d (j + 1) j = Matrix.of (fun i j => if j + (n + 1) = i then 1 else 0) i j d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dhfun: (x : ZMod d), x j + 1 X d x j = 0hfun': (x : ZMod d), x j + 1 Matrix.of (fun i j => if j + n = i then 1 else 0) i x * X d x j = 0h:j + (n + 1) = iMatrix.of (fun i j => if j + n = i then 1 else 0) i (j + 1) * X d (j + 1) j = Matrix.of (fun i j => if j + (n + 1) = i then 1 else 0) i jd:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dhfun: (x : ZMod d), x j + 1 X d x j = 0hfun': (x : ZMod d), x j + 1 Matrix.of (fun i j => if j + n = i then 1 else 0) i x * X d x j = 0h:¬j + (n + 1) = iMatrix.of (fun i j => if j + n = i then 1 else 0) i (j + 1) * X d (j + 1) j = Matrix.of (fun i j => if j + (n + 1) = i then 1 else 0) i j d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dhfun: (x : ZMod d), x j + 1 X d x j = 0hfun': (x : ZMod d), x j + 1 Matrix.of (fun i j => if j + n = i then 1 else 0) i x * X d x j = 0h:j + (n + 1) = iMatrix.of (fun i j => if j + n = i then 1 else 0) i (j + 1) * X d (j + 1) j = Matrix.of (fun i j => if j + (n + 1) = i then 1 else 0) i jd:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dhfun: (x : ZMod d), x j + 1 X d x j = 0hfun': (x : ZMod d), x j + 1 Matrix.of (fun i j => if j + n = i then 1 else 0) i x * X d x j = 0h:¬j + (n + 1) = iMatrix.of (fun i j => if j + n = i then 1 else 0) i (j + 1) * X d (j + 1) j = Matrix.of (fun i j => if j + (n + 1) = i then 1 else 0) i j d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dhfun: (x : ZMod d), x j + 1 X d x j = 0hfun': (x : ZMod d), x j + 1 Matrix.of (fun i j => if j + n = i then 1 else 0) i x * X d x j = 0h:¬j + (n + 1) = ij + 1 + n = i X d (j + 1) j = 0; d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dhfun: (x : ZMod d), x j + 1 X d x j = 0hfun': (x : ZMod d), x j + 1 Matrix.of (fun i j => if j + n = i then 1 else 0) i x * X d x j = 0h:j + 1 + n = i(if j + 1 + n = i then X d (j + 1) j else 0) = 1d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dhfun: (x : ZMod d), x j + 1 X d x j = 0hfun': (x : ZMod d), x j + 1 Matrix.of (fun i j => if j + n = i then 1 else 0) i x * X d x j = 0h:¬j + (n + 1) = ij + 1 + n = i X d (j + 1) j = 0; d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dhfun: (x : ZMod d), x j + 1 X d x j = 0hfun': (x : ZMod d), x j + 1 Matrix.of (fun i j => if j + n = i then 1 else 0) i x * X d x j = 0h:¬j + (n + 1) = ij + 1 + n = i X d (j + 1) j = 0 d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dhfun: (x : ZMod d), x j + 1 X d x j = 0hfun': (x : ZMod d), x j + 1 Matrix.of (fun i j => if j + n = i then 1 else 0) i x * X d x j = 0h:¬j + (n + 1) = ihj:j + 1 + n = iX d (j + 1) j = 0 d:inst✝:NeZero dn:hind:X d ^ n = Matrix.of fun i j => if j + n = i then 1 else 0i:ZMod dj:ZMod dhfun: (x : ZMod d), x j + 1 X d x j = 0hfun': (x : ZMod d), x j + 1 Matrix.of (fun i j => if j + n = i then 1 else 0) i x * X d x j = 0h:¬j + (n + 1) = ihj:j + (n + 1) = iX d (j + 1) j = 0 All goals completed! 🐙

The Pauli X matrix has order d.

Lemma4.31
Group: Core properties of the single-qudit Pauli matrices. (8)
Hover another entry in this group to preview it.
L∃∀Nused by 0

The d-th power of the d-dimensional Pauli X matrix is the identity matrix: X^d = I.

Lean code for Lemma4.31lemma X_pow_d_eq_one : X d ^ d = 1 := d:inst✝:NeZero dX d ^ d = 1 d:inst✝:NeZero d(Matrix.of fun i j => if j + d = i then 1 else 0) = 1 d:inst✝:NeZero di:ZMod dj:ZMod dMatrix.of (fun i j => if j + d = i then 1 else 0) i j = 1 i j d:inst✝:NeZero di:ZMod dj:ZMod d(if j = i then 1 else 0) = 1 i j d:inst✝:NeZero di:ZMod dj:ZMod d(if i = j then 1 else 0) = 1 i j All goals completed! 🐙

The generalized Pauli Z matrix is diagonal and introduces a phase ω to each standard basis vector \ket{k}.

Definition4.32
Group: Core properties of the single-qudit Pauli matrices. (8)
Hover another entry in this group to preview it.
L∃∀N
Used by 2
Hover a use site to preview it.
Preview
Definition 5.46
Loading preview
Hover a use site to preview it.

The d-dimensional Pauli Z matrix acts as follows: Z \ket{k} = ω^k \ket{k} where k ∈ ℤ_d and ω is the primitive d-th root of unity from Definition 2.3.

Lean code for Definition4.32noncomputable def Z : Matrix (ZMod d) (ZMod d) := Matrix.of fun i j => if i = j then ω d ^ i.val else 0

The Pauli Z matrix also has order d.

Lemma4.33
Group: Core properties of the single-qudit Pauli matrices. (8)
Hover another entry in this group to preview it.
L∃∀Nused by 0

The d-th power of the d-dimensional Pauli Z matrix is the identity matrix: Z^d = I.

Lean codelemma Z_pow_n (n : ) : Z d ^ n = Matrix.diagonal (fun i => ω d ^ (i.val * n)):= d:inst✝:NeZero dn:Z d ^ n = Matrix.diagonal fun i => ω d ^ (i.val * n) d:inst✝:NeZero dn:hdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valZ d ^ n = Matrix.diagonal fun i => ω d ^ (i.val * n) d:inst✝:NeZero dn:hdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valMatrix.diagonal ((fun i => ω d ^ i.val) ^ n) = Matrix.diagonal fun i => ω d ^ (i.val * n) d:inst✝:NeZero dn:hdiag:Z d = Matrix.diagonal fun i => ω d ^ i.val (i : ZMod d), (ω d ^ i.val) ^ n = ω d ^ (i.val * n) d:inst✝:NeZero dn:hdiag:Z d = Matrix.diagonal fun i => ω d ^ i.vali:ZMod d(ω d ^ i.val) ^ n = ω d ^ (i.val * n) All goals completed! 🐙
Lean code for Lemma4.33lemma Z_pow_d_eq_one : (Z d) ^ d = 1 := d:inst✝:NeZero dZ d ^ d = 1 d:inst✝:NeZero d(Matrix.diagonal fun i => ω d ^ (i.val * d)) = 1 d:inst✝:NeZero d(fun i => ω d ^ (i.val * d)) = 1 d:inst✝:NeZero di:ZMod dω d ^ (i.val * d) = 1 i d:inst✝:NeZero di:ZMod d1 = 1 i All goals completed! 🐙

Pauli X and Z commute up to a phase.

Lemma4.35
Group: Core properties of the single-qudit Pauli matrices. (8)
Hover another entry in this group to preview it.
L∃∀Nused by 0

Pauli X and Z matrices satisfy the following commutation relation: Z X = ω X Z.

Lean code for Lemma4.35lemma ZX_eq_omega_mul_XZ : Z d * X d = ω d (X d * Z d) := d:inst✝:NeZero dZ d * X d = ω d (X d * Z d) d:inst✝:NeZero di:ZMod dj:ZMod d(Z d * X d) i j = (ω d (X d * Z d)) i j d:inst✝:NeZero di:ZMod dj:ZMod d j_1, Z d i j_1 * X d j_1 j = ω d j_1, X d i j_1 * Z d j_1 j d:inst✝:NeZero di:ZMod dj:ZMod d j_1, Matrix.of (fun i j => if i = j then ω d ^ i.val else 0) i j_1 * Matrix.of (fun i j => if j + 1 = i then 1 else 0) j_1 j = ω d j_1, Matrix.of (fun i j => if j + 1 = i then 1 else 0) i j_1 * Matrix.of (fun i j => if i = j then ω d ^ i.val else 0) j_1 j d:inst✝:NeZero di:ZMod dj:ZMod d(if i = j + 1 then ω d ^ i.val else 0) = if j + 1 = i then ω d * ω d ^ j.val else 0 d:inst✝:NeZero di:ZMod dj:ZMod d(if i = j + 1 then ω d ^ i.val else 0) = if i = j + 1 then ω d * ω d ^ j.val else 0 d:inst✝:NeZero di:ZMod dj:ZMod dh:i = j + 1(if i = j + 1 then ω d ^ i.val else 0) = if i = j + 1 then ω d * ω d ^ j.val else 0d:inst✝:NeZero di:ZMod dj:ZMod dh:¬i = j + 1(if i = j + 1 then ω d ^ i.val else 0) = if i = j + 1 then ω d * ω d ^ j.val else 0 /- Case 1: h : i = j + 1-/ d:inst✝:NeZero di:ZMod dj:ZMod dh:i = j + 1(if i = j + 1 then ω d ^ i.val else 0) = if i = j + 1 then ω d * ω d ^ j.val else 0 All goals completed! 🐙 /- Case 2: h : i ≠ j + 1-/ All goals completed! 🐙

And so do their powers.

Lemma4.36
Group: Core properties of the single-qudit Pauli matrices. (8)
Hover another entry in this group to preview it.
L∃∀Nused by 0

Pauli X and Z matrices satisfy the following commutation relation: Z^k X^ℓ = ω^{k·ℓ} X^ℓ Z^k.

Lean code for Lemma4.36lemma declaration uses `sorry`Z_pow_X_pow_eq_omega_mul_X_pow_Z_pow (k : ) ( : ) : (Z d) ^ k * (X d) ^ = (ω d) ^ (k * ) ((X d) ^ * (Z d) ^ k) := d:inst✝:NeZero dk::Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k) induction with d:inst✝:NeZero dk:Z d ^ k * X d ^ 0 = ω d ^ (k * 0) (X d ^ 0 * Z d ^ k) All goals completed! 🐙 d:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)Z d ^ k * X d ^ ( + 1) = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) nth_rw 1 [pow_succ'd:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)Z d ^ k * (X d * X d ^ ) = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) nth_rw 1 [ mul_assocd:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)Z d ^ k * X d * X d ^ = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) have h : Z d ^ k * X d * X d ^ = ω d ^ k X d * Z d ^ k * X d ^ := d:inst✝:NeZero dk::Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k) All goals completed! 🐙 d:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)h:Z d ^ k * X d * X d ^ = ω d ^ k X d * Z d ^ k * X d ^ ω d ^ k X d * Z d ^ k * X d ^ = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) nth_rw 1 [mul_assocd:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)h:Z d ^ k * X d * X d ^ = ω d ^ k X d * Z d ^ k * X d ^ ω d ^ k X d * (Z d ^ k * X d ^ ) = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) --nth_rw 1 [mul_comm] d:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)h:Z d ^ k * X d * X d ^ = ω d ^ k X d * Z d ^ k * X d ^ ω d ^ k (X d * (Z d ^ k * X d ^ )) = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) d:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)h:Z d ^ k * X d * X d ^ = ω d ^ k X d * Z d ^ k * X d ^ X d * ω d ^ k (Z d ^ k * X d ^ ) = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) d:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)h:Z d ^ k * X d * X d ^ = ω d ^ k X d * Z d ^ k * X d ^ X d * ω d ^ k ω d ^ (k * ) (X d ^ * Z d ^ k) = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) d:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)h:Z d ^ k * X d * X d ^ = ω d ^ k X d * Z d ^ k * X d ^ X d * (ω d ^ k * ω d ^ (k * )) (X d ^ * Z d ^ k) = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) d:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)h:Z d ^ k * X d * X d ^ = ω d ^ k X d * Z d ^ k * X d ^ (ω d ^ k * ω d ^ (k * )) (X d * (X d ^ * Z d ^ k)) = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) d:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)h:Z d ^ k * X d * X d ^ = ω d ^ k X d * Z d ^ k * X d ^ ω d ^ (k + k * ) (X d * (X d ^ * Z d ^ k)) = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) d:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)h:Z d ^ k * X d * X d ^ = ω d ^ k X d * Z d ^ k * X d ^ ω d ^ (k * (1 + )) (X d * (X d ^ * Z d ^ k)) = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) d:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)h:Z d ^ k * X d * X d ^ = ω d ^ k X d * Z d ^ k * X d ^ ω d ^ (k * (1 + )) (X d * X d ^ * Z d ^ k) = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) d:inst✝:NeZero dk::ih:Z d ^ k * X d ^ = ω d ^ (k * ) (X d ^ * Z d ^ k)h:Z d ^ k * X d * X d ^ = ω d ^ k X d * Z d ^ k * X d ^ ω d ^ (k * (1 + )) (X d ^ ( + 1) * Z d ^ k) = ω d ^ (k * ( + 1)) (X d ^ ( + 1) * Z d ^ k) All goals completed! 🐙 --#check Matrix.mul_smul /-rw [smul_mul_assoc] rw [ih] rw [smul_smul] rw [← pow_add] rw [add_comm] rw [← mul_add_one] induction k with | zero => simp rw [pow_succ'] | succ k ih2 =>-/

And also backwards

Lean codelemma X_pow_Z_pow_eq_omega_mul_Z_pow_X_pow (k : ZMod d) (l : ZMod d) : (X d) ^ k.val * (Z d) ^ l.val = (ω d) ^ (-(k * l)).val ((Z d) ^ l.val * (X d) ^ k.val) := d:inst✝:NeZero dk:ZMod dl:ZMod dX d ^ k.val * Z d ^ l.val = ω d ^ (-(k * l)).val (Z d ^ l.val * X d ^ k.val) d:inst✝:NeZero dk:ZMod dl:ZMod dX d ^ k.val * Z d ^ l.val = ω d ^ (-(k * l)).val ω d ^ (l.val * k.val) (X d ^ k.val * Z d ^ l.val) d:inst✝:NeZero dk:ZMod dl:ZMod dX d ^ k.val * Z d ^ l.val = (ω d ^ (-(k * l)).val * ω d ^ (l.val * k.val)) (X d ^ k.val * Z d ^ l.val) nth_rw 2 [omega_pow_n_mod_dd:inst✝:NeZero dk:ZMod dl:ZMod dX d ^ k.val * Z d ^ l.val = (ω d ^ (-(k * l)).val * ω d ^ (l.val * k.val % d)) (X d ^ k.val * Z d ^ l.val) d:inst✝:NeZero dk:ZMod dl:ZMod dX d ^ k.val * Z d ^ l.val = ω d ^ ((-(k * l)).val + (l * k).val) (X d ^ k.val * Z d ^ l.val) d:inst✝:NeZero dk:ZMod dl:ZMod dX d ^ k.val * Z d ^ l.val = ω d ^ (-(k * l) + l * k).val (X d ^ k.val * Z d ^ l.val) d:inst✝:NeZero dk:ZMod dl:ZMod dX d ^ k.val * Z d ^ l.val = ω d ^ 0 (X d ^ k.val * Z d ^ l.val) All goals completed! 🐙
Lemma4.38
Group: Core properties of the single-qudit Pauli matrices. (8)
Hover another entry in this group to preview it.
L∃∀Nused by 0

Powers of Pauli X and Z satisfy X^n = X^{n \% d} Z^n = Z^{n \% d}

Lean code for Lemma4.38theorem X_pow_n_mod_d (n : ): X d ^ n = X d ^ (n % d) := pow_eq_pow_mod n (X_pow_d_eq_one d) theorem Z_pow_n_mod_d (n : ): Z d ^ n = Z d ^ (n % d) := pow_eq_pow_mod n (Z_pow_d_eq_one d)
Lemma4.39
Group: Core properties of the single-qudit Pauli matrices. (8)
Hover another entry in this group to preview it.
L∃∀Nused by 0

X^{†} = X^(-1).

Lean code for Lemma4.39lemma X_inv : (X d).conjTranspose = (X d)^((-1 : ZMod d).val) := d:inst✝:NeZero d(X d).conjTranspose = X d ^ (-1).val d:inst✝:NeZero di:ZMod dj:ZMod d(X d).conjTranspose i j = (X d ^ (-1).val) i j d:inst✝:NeZero di:ZMod dj:ZMod d(X d).conjTranspose i j = Matrix.of (fun i j => if j + (-1).val = i then 1 else 0) i j d:inst✝:NeZero di:ZMod dj:ZMod dstar (X d j i) = Matrix.of (fun i j => if j + (-1).val = i then 1 else 0) i j d:inst✝:NeZero di:ZMod dj:ZMod dstar (Matrix.of (fun i j => if j + 1 = i then 1 else 0) j i) = Matrix.of (fun i j => if j + (-1).val = i then 1 else 0) i j d:inst✝:NeZero di:ZMod dj:ZMod d(if i + 1 = j then 1 else 0) = if j + -1 = i then 1 else 0 have hfalso: (k: ZMod d) k + 1 + ((-1 : ) % d).toNat = k := d:inst✝:NeZero d(X d).conjTranspose = X d ^ (-1).val d:inst✝:NeZero di:ZMod dj:ZMod dk:ZMod dk + 1 + (-1 % d).toNat = k have h3 : 0 ((-1 : ) % d) := d:inst✝:NeZero d(X d).conjTranspose = X d ^ (-1).val d:inst✝:NeZero di:ZMod dj:ZMod dk:ZMod dd 0 All goals completed! 🐙 d:inst✝:NeZero di:ZMod dj:ZMod dk:ZMod dh3:0 -1 % dk + 1 + (-1 % d) = k All goals completed! 🐙 d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:i + 1 = jh2:j + -1 = i1 = 1d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:i + 1 = jh2:¬j + -1 = i1 = 0d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:¬i + 1 = jh2:j + -1 = i0 = 1d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:¬i + 1 = jh2:¬j + -1 = i0 = 0; d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:i + 1 = jh2:¬j + -1 = i1 = 0d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:¬i + 1 = jh2:j + -1 = i0 = 1d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:¬i + 1 = jh2:¬j + -1 = i0 = 0 d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:i + 1 = jh2:¬j + -1 = i1 = 0 d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:i + 1 = jh2:¬j + -1 = iFalse d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:i + 1 = jh2:¬i + 1 + -1 = iFalse All goals completed! 🐙 d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:¬i + 1 = jh2:j + -1 = i0 = 1 d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:¬i + 1 = jh2:j + -1 = iFalse d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:¬j + (-1 + 1) = jh2:j + -1 = iFalse nth_rw 2 [add_commd:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:¬j + (1 + -1) = jh2:j + -1 = iFalse at h1 d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:¬j + 1 + -1 = jh2:j + -1 = iFalse All goals completed! 🐙 d:inst✝:NeZero di:ZMod dj:ZMod dhfalso: (k : ZMod d), k + 1 + (-1 % d).toNat = kh1:¬i + 1 = jh2:¬j + -1 = i0 = 0 All goals completed! 🐙
Lean codelemma X_pow_eq_mod_d : (x: ) (y: ) (x % d = y % d X d ^ x = X d ^ y ) := d:inst✝:NeZero d (x y : ), x % d = y % d X d ^ x = X d ^ y intro x d:inst✝:NeZero dx:y:x % d = y % d X d ^ x = X d ^ y d:inst✝:NeZero dx:y:h:x % d = y % dX d ^ x = X d ^ y d:inst✝:NeZero dx:y:h:x % d = y % dX d ^ (d * (x / d) + x % d) = X d ^ y d:inst✝:NeZero dx:y:h:x % d = y % dX d ^ (d * (x / d) + x % d) = X d ^ (d * (y / d) + y % d) d:inst✝:NeZero dx:y:h:x % d = y % d(X d ^ d) ^ (x / d) * X d ^ (x % d) = (X d ^ d) ^ (y / d) * X d ^ (y % d) d:inst✝:NeZero dx:y:h:x % d = y % d1 ^ (x / d) * X d ^ (x % d) = 1 ^ (y / d) * X d ^ (y % d) d:inst✝:NeZero dx:y:h:x % d = y % dX d ^ (x % d) = X d ^ (y % d) All goals completed! 🐙
Lean codelemma X_inv_pow : (x: ZMod d) ((X d)^(x.val)).conjTranspose = (X d)^((-x).val):= d:inst✝:NeZero d (x : ZMod d), (X d ^ x.val).conjTranspose = X d ^ (-x).val d:inst✝:NeZero dx:ZMod d(X d ^ x.val).conjTranspose = X d ^ (-x).val d:inst✝:NeZero dx:ZMod dX d ^ ((-1).val * x.val) = X d ^ (-x).val d:inst✝:NeZero dx:ZMod d(-1).val * x.val % d = (-x).val % d d:inst✝:NeZero dx:ZMod d(-x).val = (-x).val % d All goals completed! 🐙
Lean codelemma Z_inv : (Z d).conjTranspose = (Z d)^((-1 : ZMod d).val) := d:inst✝:NeZero d(Z d).conjTranspose = Z d ^ (-1).val d:inst✝:NeZero di:ZMod dj:ZMod d(Z d).conjTranspose i j = (Z d ^ (-1).val) i j d:inst✝:NeZero di:ZMod dj:ZMod dstar (Z d j i) = (Z d ^ (-1).val) i j d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valstar (Z d j i) = (Z d ^ (-1).val) i j d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valstar (if j = i then ω d ^ j.val else 0) = if i = j then ((fun i => ω d ^ i.val) ^ (-1).val) i else 0 d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.val(starRingEnd ) (if j = i then ω d ^ j.val else 0) = if i = j then (ω d ^ i.val) ^ (-1).val else 0 d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:i = j(starRingEnd ) (ω d ^ j.val) = (ω d ^ i.val) ^ (-1).vald:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:¬i = j(starRingEnd ) (ω d ^ j.val) = 0d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:¬j = ih2:i = j(starRingEnd ) 0 = (ω d ^ i.val) ^ (-1).vald:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:¬j = ih2:¬i = j(starRingEnd ) 0 = 0 d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:i = j(starRingEnd ) (ω d ^ j.val) = (ω d ^ i.val) ^ (-1).val d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:i = j(starRingEnd ) (ω d ^ i.val) = (ω d ^ i.val) ^ (-1).val d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:i = j(starRingEnd ) (ω d) ^ i.val = (ω d ^ i.val) ^ (-1).val d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:i = j(starRingEnd ) (ω d) ^ i.val = (ω d ^ (-1).val) ^ i.val have homega : (starRingEnd ) (ω d) = ω d ^ (-1 : ) := d:inst✝:NeZero d(Z d).conjTranspose = Z d ^ (-1).val d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:i = j(starRingEnd ) (Complex.exp (2 * Real.pi * Complex.I / d)) = Complex.exp (2 * Real.pi * Complex.I / d) ^ (-1) d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:i = jComplex.exp ((starRingEnd ) (2 * Real.pi * Complex.I / d)) = Complex.exp ((-1) * (2 * Real.pi * Complex.I / d)) d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:i = jComplex.exp (star (2 * Real.pi * Complex.I / d)) = Complex.exp ((-1) * (2 * Real.pi * Complex.I / d)) d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:i = jComplex.exp (-(2 * Real.pi * Complex.I) / d) = Complex.exp (-(2 * Real.pi * Complex.I / d)) All goals completed! 🐙 d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:i = jhomega:(starRingEnd ) (ω d) = ω d ^ (-1)(ω d ^ (↑(-1)).val) ^ i.val = (ω d ^ (-1).val) ^ i.val d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:i = jhomega:(starRingEnd ) (ω d) = ω d ^ (-1)(-1) = -1 All goals completed! 🐙 d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:¬i = j(starRingEnd ) (ω d ^ j.val) = 0 d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:j = ih2:¬i = jFalse All goals completed! 🐙 d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:¬j = ih2:i = j(starRingEnd ) 0 = (ω d ^ i.val) ^ (-1).val d:inst✝:NeZero di:ZMod dj:ZMod dhdiag:Z d = Matrix.diagonal fun i => ω d ^ i.valh1:¬j = ih2:i = jFalse All goals completed! 🐙 All goals completed! 🐙
Lean codelemma Z_pow_eq_mod_d : (x: ) (y: ) (x % d = y % d Z d ^ x = Z d ^ y ) := d:inst✝:NeZero d (x y : ), x % d = y % d Z d ^ x = Z d ^ y -- This is exactly the same proof as for X, -- maybe we can consolidate intro x d:inst✝:NeZero dx:y:x % d = y % d Z d ^ x = Z d ^ y d:inst✝:NeZero dx:y:h:x % d = y % dZ d ^ x = Z d ^ y d:inst✝:NeZero dx:y:h:x % d = y % dZ d ^ (d * (x / d) + x % d) = Z d ^ y d:inst✝:NeZero dx:y:h:x % d = y % dZ d ^ (d * (x / d) + x % d) = Z d ^ (d * (y / d) + y % d) d:inst✝:NeZero dx:y:h:x % d = y % d(Z d ^ d) ^ (x / d) * Z d ^ (x % d) = (Z d ^ d) ^ (y / d) * Z d ^ (y % d) d:inst✝:NeZero dx:y:h:x % d = y % d1 ^ (x / d) * Z d ^ (x % d) = 1 ^ (y / d) * Z d ^ (y % d) d:inst✝:NeZero dx:y:h:x % d = y % dZ d ^ (x % d) = Z d ^ (y % d) All goals completed! 🐙
Lean codelemma Z_inv_pow : (x: ZMod d) ((Z d)^(x.val)).conjTranspose = (Z d)^((-x).val):= d:inst✝:NeZero d (x : ZMod d), (Z d ^ x.val).conjTranspose = Z d ^ (-x).val -- This is exactly the same proof as for X, -- maybe we can consolidate d:inst✝:NeZero dx:ZMod d(Z d ^ x.val).conjTranspose = Z d ^ (-x).val d:inst✝:NeZero dx:ZMod dZ d ^ ((-1).val * x.val) = Z d ^ (-x).val d:inst✝:NeZero dx:ZMod d(-1).val * x.val % d = (-x).val % d d:inst✝:NeZero dx:ZMod d(-x).val = (-x).val % d All goals completed! 🐙