# How can I specify a (possibly non-associative) algebra over a finite (small) set of generators by means of structure constants?

I am looking for something similar to the Axiom/FriCAS domain AlgebraGivenByStructuralConstants which implements finite rank algebras over a commutative ring, given by the structural constants with respect to a fixed basis [a1,..,an] or equivalently in terms of generating equations of the form

a_i * a_j = gamma_ij1 * a_1 + ... + gamma_ijn * a_n

where gamma is a vector/list of length n of n by n matrices.

In particular I would like to be able to easily compute various properties of such algebras such as the conditions for idempotents etc. For example:

edit retag close merge delete

Sort by » oldest newest most voted

One possibility is to use FiniteDimensionalAlgebra . (Or similar "magmatic" constructors.)

For example:

F = GF(7)
A = [ Matrix( GL(3,F).random_element().list() )
for _ in range(3) ]
M = FiniteDimensionalAlgebra( F, A, names='s' )
M

s0, s1, s2 = M.gens()
s = s0, s1, s2

for k in (0,1,2):
for n in (0,1,2):
print "%s * %s = %s" % ( s[k], s[n], s[k]*s[n] )
print

for k in (0,1,2):
print "A[%s] is\n%s\n" % ( k, A[k] )


Here $F$ is the base field, taken with $7$ elements to make the multiplication constraints simple to follow. The data $A$ is the data of three matrices. (It collects the $\gamma$-constraints from the post.) It is randomly constructed here. (The GL has no structural meaning, it came first into the fingers.)

The above evaluates to:

Finite-dimensional algebra of degree 3 over Finite Field of size 7
s0 * s0 = 2*s0 + 5*s1 + 3*s2
s0 * s1 = s0 + 3*s1 + 4*s2
s0 * s2 = 5*s0 + s1 + s2

s1 * s0 = 4*s1 + s2
s1 * s1 = 5*s0 + 6*s1 + 3*s2
s1 * s2 = 4*s0 + 2*s1 + 5*s2

s2 * s0 = 3*s0 + 3*s1 + 2*s2
s2 * s1 = 3*s0 + 5*s2
s2 * s2 = 5*s0 + 3*s1

A is
[2 5 3]
[0 4 1]
[3 3 2]

A is
[1 3 4]
[5 6 3]
[3 0 5]

A is
[5 1 1]
[4 2 5]
[5 3 0]


I think it is clear how the entries in the three matrices contribute to the multiplication constraints. I tried also...

sage: M.is_associative()
False
sage: M.is_commutative()
False

more

This is nice. There is a lot of useful documentation: here but so far I could not easily find how compute the center of the algebra (elements that commute with all other elements) but perhaps this is defined in some other way?