Ask Your Question
2

How to generate a cyclic matrix

asked 2018-02-06 12:22:26 -0500

omgggggg gravatar image

How to generate all 8×8 cyclic matrix $A$ with the first row $(a_0, a_1, \ldots, a_7)$,

the matrix $A\in GL(8, 2)$ and the first row $a_0 + a_1 + \ldots + a_7 \neq 0$

edit retag flag offensive close merge delete

Comments

What is a cyclic matrix?

Why should have the first row the property that the sum of entries is not zero? (It would maybe be enough to have a non zero row vector, if the question becomes clear.)

dan_fulea gravatar imagedan_fulea ( 2018-02-06 16:09:44 -0500 )edit

A cyclic matrix means a circulant matrix. We need the first row the property that the sum of entries is not zero so that this cyclic matrix could be a invertible matrix.

omgggggg gravatar imageomgggggg ( 2018-02-07 01:38:44 -0500 )edit

1 answer

Sort by » oldest newest most voted
1

answered 2018-02-07 02:30:27 -0500

dan_fulea gravatar image

Here are some possibilities to generate a circulant matrix, having as input its first row a:

def circulantMatrix0( a ):
    n = len(a)
    R = range(n)
    return matrix( [ [ a[ (j-k) % n ] for j in R ] for k in R ] )

def circulantMatrix1( a ):
    n = len(a)
    R = range(n)
    return matrix( [ [ a[j-k] for j in R ] for k in R ] )

def circulantMatrix2( a, field=GF(2) ):
    n = len(a)
    T = matrix( F, n, n, [1 if k==(j+1)%n else 0
                          for j in range(n)
                          for k in range(n) ] )
    return sum( [ a[j]*T^j for j in range(n) ] )

def circulantMatrix3( a, field=GF(2) ):
    n = len(a)
    b = [a[j] for j in range(n)]
    b = b+b
    return matrix( n, n, [ b[n-j:2*n-j] for j in range(n) ] )


# Tests:

F = GF(2)
a = vector( F, 8, [1,0,0,0,1,0,0,1] )
A = circulantMatrix0(a)
B = circulantMatrix1(a)
C = circulantMatrix2(a)
D = circulantMatrix3(a)

Then we have:

sage: print A
[1 0 0 0 1 0 0 1]
[1 1 0 0 0 1 0 0]
[0 1 1 0 0 0 1 0]
[0 0 1 1 0 0 0 1]
[1 0 0 1 1 0 0 0]
[0 1 0 0 1 1 0 0]
[0 0 1 0 0 1 1 0]
[0 0 0 1 0 0 1 1]
sage: A==B and A==C and A==D
True
sage: A.charpoly().factor()
(x + 1)^8
sage: A.jordan_form()

[1 1 0 0 0 0 0 0]
[0 1 1 0 0 0 0 0]
[0 0 1 1 0 0 0 0]
[0 0 0 1 1 0 0 0]
[0 0 0 0 1 1 0 0]
[0 0 0 0 0 1 1 0]
[0 0 0 0 0 0 1 1]
[0 0 0 0 0 0 0 1]
sage:
edit flag offensive delete link more

Comments

P.S. Sorry, the field is declared as switch in two of the routines, the last one does not need it, please remove, the other one does not use the field, but the global F, please use the field as base field in the definition of the returned matrix.

The question is interesting! one up...

dan_fulea gravatar imagedan_fulea ( 2018-02-07 05:44:18 -0500 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 2018-02-06 12:22:26 -0500

Seen: 87 times

Last updated: Feb 07