# mathlib3documentation

linear_algebra.matrix.circulant

# Circulant matrices #

THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.

This file contains the definition and basic results about circulant matrices. Given a vector v : n → α indexed by a type that is endowed with subtraction, matrix.circulant v is the matrix whose (i, j)th entry is v (i - j).

## Main results #

• matrix.circulant: the circulant matrix generated by a given vector v : n → α.
• matrix.circulant_mul: the product of two circulant matrices circulant v and circulant w is the circulant matrix generated by mul_vec (circulant v) w.
• matrix.circulant_mul_comm: multiplication of circulant matrices commutes when the elements do.

## Implementation notes #

matrix.fin.foo is the fin n version of matrix.foo. Namely, the index type of the circulant matrices in discussion is fin n.

## Tags #

circulant, matrix

def matrix.circulant {α : Type u_1} {n : Type u_4} [has_sub n] (v : n α) :
n α

Given the condition [has_sub n] and a vector v : n → α, we define circulant v to be the circulant matrix generated by v of type matrix n n α. The (i,j)th entry is defined to be v (i - j).

Equations
@[simp]
theorem matrix.circulant_apply {α : Type u_1} {n : Type u_4} [has_sub n] (v : n α) (i j : n) :
j = v (i - j)
theorem matrix.circulant_col_zero_eq {α : Type u_1} {n : Type u_4} [add_group n] (v : n α) (i : n) :
0 = v i
theorem matrix.circulant_injective {α : Type u_1} {n : Type u_4} [add_group n] :
theorem matrix.fin.circulant_injective {α : Type u_1} (n : ) :
function.injective (λ (v : fin n α),
@[simp]
theorem matrix.circulant_inj {α : Type u_1} {n : Type u_4} [add_group n] {v w : n α} :
v = w
@[simp]
theorem matrix.fin.circulant_inj {α : Type u_1} {n : } {v w : fin n α} :
v = w
theorem matrix.transpose_circulant {α : Type u_1} {n : Type u_4} [add_group n] (v : n α) :
= matrix.circulant (λ (i : n), v (-i))
theorem matrix.conj_transpose_circulant {α : Type u_1} {n : Type u_4} [has_star α] [add_group n] (v : n α) :
= matrix.circulant (has_star.star (λ (i : n), v (-i)))
theorem matrix.fin.transpose_circulant {α : Type u_1} {n : } (v : fin n α) :
= matrix.circulant (λ (i : fin n), v (-i))
theorem matrix.fin.conj_transpose_circulant {α : Type u_1} [has_star α] {n : } (v : fin n α) :
= matrix.circulant (has_star.star (λ (i : fin n), v (-i)))
theorem matrix.map_circulant {α : Type u_1} {β : Type u_2} {n : Type u_4} [has_sub n] (v : n α) (f : α β) :
.map f = matrix.circulant (λ (i : n), f (v i))
theorem matrix.circulant_neg {α : Type u_1} {n : Type u_4} [has_neg α] [has_sub n] (v : n α) :
@[simp]
theorem matrix.circulant_zero (α : Type u_1) (n : Type u_2) [has_zero α] [has_sub n] :
theorem matrix.circulant_add {α : Type u_1} {n : Type u_4} [has_add α] [has_sub n] (v w : n α) :
theorem matrix.circulant_sub {α : Type u_1} {n : Type u_4} [has_sub α] [has_sub n] (v w : n α) :
theorem matrix.circulant_mul {α : Type u_1} {n : Type u_4} [semiring α] [fintype n] [add_group n] (v w : n α) :
.mul =

The product of two circulant matrices circulant v and circulant w is the circulant matrix generated by mul_vec (circulant v) w.

theorem matrix.fin.circulant_mul {α : Type u_1} [semiring α] {n : } (v w : fin n α) :
.mul =
theorem matrix.circulant_mul_comm {α : Type u_1} {n : Type u_4} [fintype n] (v w : n α) :
.mul = .mul

Multiplication of circulant matrices commutes when the elements do.

theorem matrix.fin.circulant_mul_comm {α : Type u_1} {n : } (v w : fin n α) :
.mul = .mul
theorem matrix.circulant_smul {α : Type u_1} {n : Type u_4} {R : Type u_5} [has_sub n] [ α] (k : R) (v : n α) :

k • circulant v is another circulant matrix circulant (k • v).

@[simp]
theorem matrix.circulant_single_one (α : Type u_1) (n : Type u_2) [has_zero α] [has_one α] [decidable_eq n] [add_group n] :
= 1
@[simp]
theorem matrix.circulant_single {α : Type u_1} (n : Type u_2) [semiring α] [decidable_eq n] [add_group n] [fintype n] (a : α) :
= a
theorem matrix.fin.circulant_ite (α : Type u_1) [has_zero α] [has_one α] (n : ) :
matrix.circulant (λ (i : fin n), ite (i = 0) 1 0) = 1

Note we use ↑i = 0 instead of i = 0 as fin 0 has no 0. This means that we cannot state this with pi.single as we did with matrix.circulant_single.

theorem matrix.circulant_is_symm_iff {α : Type u_1} {n : Type u_4} [add_group n] {v : n α} :
(i : n), v (-i) = v i

A circulant of v is symmetric iff v equals its reverse.

theorem matrix.fin.circulant_is_symm_iff {α : Type u_1} {n : } {v : fin n α} :
(i : fin n), v (-i) = v i
theorem matrix.circulant_is_symm_apply {α : Type u_1} {n : Type u_4} [add_group n] {v : n α} (h : .is_symm) (i : n) :
v (-i) = v i

If circulant v is symmetric, ∀ i j : I, v (- i) = v i.

theorem matrix.fin.circulant_is_symm_apply {α : Type u_1} {n : } {v : fin n α} (h : .is_symm) (i : fin n) :
v (-i) = v i