Vector Spaces & Modules
Vector Spaces and Modules are defined using Groups, Rings, and Fields.
Vector Space
A Vector Space, \(\mathscr{V} = \langle G, F, \circ \rangle\), consists of the following:
an abelian Group, \(G = \langle V, \oplus \rangle\) (i.e., the “vectors”)
a field, \(F = \langle S, +, \cdot \rangle\) (i.e., the “scalars”)
and a binary operator, \(\circ : S \times V \to V\)
where the following five conditions hold:
Scaled Vectors: For all \(s \in S\) and \(v \in V \Rightarrow s \circ v \in V\)
Scaling by One: If \(1 \in S\) is the multiplicative identity element of \(F\), then \(1 \circ v = v\)
Distributivity of Scalars Over Vector Addition: \(s \circ (v_1 \oplus v_2) = (s \circ v_1) \oplus (s \circ v_2)\)
Distributivity of Vectors Over Scalar Addition: \((s_1 + s_2) \circ v = (s_1 \circ v) \oplus (s_2 \circ v)\)
Scalar-Vector Associativity: \(s_1 \circ (s_2 \circ v) = (s_1 \cdot s_2) \circ v\)
A Module, \(\mathscr{M} = \langle G, R, \circ \rangle\), has the same conditions as a Vector Space, except that the Field is replaced by a Ring, \(R\).
Internal Representation of Vector Spaces & Modules
Unlike Groups, Rings, Fields, and such, Vector Spaces and Modules have
more than one set of elements and more than one or two binary
operations. Within the finite_algebra implementation, the internal
representation is as shown below. The five elements listed must be input
to the function, make_finite_algebra, in the order shown, to
construct a Module or VectorSpace.
name: (
str) A short name for the algebra;description: (
str) Any additional, useful information about the algebra;scalars: A
Ringor aField. The Ring or Field elements are called scalars and the scalar addition and multiplication operations are those of the Ring or Field;vectors: An abelian
Group. Its elements are vectors and its operation is vector addition;sv_op: A scalar-vector binary operation, \(\circ : S \times V \to V\), for “scaling vectors”
If the scalars are a Field, then make_finite_algebra will construct
a VectorSpace. Otherwise, if the scalars are a Ring, then a Module will
be constructed.
Examples
\(\mathbb{R}^n\)
Perhaps the most well-known example of a vector space is \(\mathbb{R}^n\), the n-dimensional vector space over the real numbers. Of course, \(\mathbb{R}^n\) satisfies all of the conditions listed in the definition above. The scalar field of \(\mathbb{R}^n\) is \(\mathbb{R}\) itself, and the abelian group of \(\mathbb{R}^n\) is the direct product, \(\mathscr{G} = \mathbb{R} \times \dots \times \mathbb{R} \equiv \times^n \mathbb{R}\), where the group’s binary operation is component-wise addition in \(\mathbb{R}\), its identity element is \(0_n = (0, \dots, 0)\), commonly called the origin, and the scalar-vector binary operation is defined as \(s \circ v \equiv (s \circ v_1, \dots, s \circ v_n)\), where \(v = (v_1, \dots, v_n)\).
In the section to follow, this type of Vector Space (or Module), where the Group is created from the n-fold direct product of the Field, will be created using a finite Field or Ring.
A Finite, n-Dimensional Vector Space (similar to \(\mathbb{R}^n\))
Given a finite Field, F, and a positive integer, n, the expression,
NDimensionalVectorSpace(F, n), constructs an n-dimensional Vector
Space similar to how \(\mathbb{R}^n\) is constructed. Similarly,
Given a Ring, R, NDimensionalModule(R, n) constructs an
n-dimensional Module.
This is demonstrated, below, using a “field with 4 elements” (see Wikipedia).
First, we create the field:
>>> from finite_algebras import make_finite_algebra
>>> f4 = make_finite_algebra('F4',
'Field with 4 elements (from Wikipedia)',
['0', '1', 'a', '1+a'],
[['0', '1', 'a', '1+a'],
['1', '0', '1+a', 'a'],
['a', '1+a', '0', '1'],
['1+a', 'a', '1', '0']],
[['0', '0', '0', '0'],
['0', '1', 'a', '1+a'],
['0', 'a', '1+a', '1'],
['0', '1+a', '1', 'a']]
)
>>> f4
Field(
'F4',
'Field with 4 elements (from Wikipedia)',
('0', '1', 'a', '1+a'),
[[0, 1, 2, 3], [1, 0, 3, 2], [2, 3, 0, 1], [3, 2, 1, 0]],
[[0, 0, 0, 0], [0, 1, 2, 3], [0, 2, 3, 1], [0, 3, 1, 2]]
)
Now, f4 is used to create a finite, n-dimensional VectorSpace, for \(n=2\):
>>> from finite_algebras import NDimensionalVectorSpace
>>> n = 2 # We're using a small number of dimensions to limit the amount of printout below
>>> vs = NDimensionalVectorSpace(f4, n)
>>> vs.about(max_size=16)
NDimensionalVectorSpace: 2D-F4
Instance ID: 4589850304
Description: 2-dimensional Vector Space over F4
SCALARS:
** Field **
Name: F4
Instance ID: 4693506576
Description: Field with 4 elements (from Wikipedia)
Order: 4
Identity: '0'
Commutative? Yes
Cyclic?: Yes
Generators: ['1+a', 'a']
Elements:
Index Name Inverse Order
0 '0' '0' 1
1 '1' '1' 2
2 'a' 'a' 2
3 '1+a' '1+a' 2
Cayley Table (showing indices):
[[0, 1, 2, 3], [1, 0, 3, 2], [2, 3, 0, 1], [3, 2, 1, 0]]
Mult. Identity: '1'
Mult. Commutative? Yes
Zero Divisors: None
Multiplicative Cayley Table (showing indices):
[[0, 0, 0, 0], [0, 1, 2, 3], [0, 2, 3, 1], [0, 3, 1, 2]]
VECTORS:
** Ring **
Name: F4_x_F4
Instance ID: 4589849632
Description: Direct product of F4 & F4
Order: 16
Identity: '0:0'
Commutative? Yes
Cyclic?: No
Elements:
Index Name Inverse Order
0 '0:0' '0:0' 1
1 '0:1' '0:1' 2
2 '0:a' '0:a' 2
3 '0:1+a' '0:1+a' 2
4 '1:0' '1:0' 2
5 '1:1' '1:1' 2
6 '1:a' '1:a' 2
7 '1:1+a' '1:1+a' 2
8 'a:0' 'a:0' 2
9 'a:1' 'a:1' 2
10 'a:a' 'a:a' 2
11 'a:1+a' 'a:1+a' 2
12 '1+a:0' '1+a:0' 2
13 '1+a:1' '1+a:1' 2
14 '1+a:a' '1+a:a' 2
15 '1+a:1+a' '1+a:1+a' 2
Cayley Table (showing indices):
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14],
[2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13],
[3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12],
[4, 5, 6, 7, 0, 1, 2, 3, 12, 13, 14, 15, 8, 9, 10, 11],
[5, 4, 7, 6, 1, 0, 3, 2, 13, 12, 15, 14, 9, 8, 11, 10],
[6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9],
[7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8],
[8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7],
[9, 8, 11, 10, 13, 12, 15, 14, 1, 0, 3, 2, 5, 4, 7, 6],
[10, 11, 8, 9, 14, 15, 12, 13, 2, 3, 0, 1, 6, 7, 4, 5],
[11, 10, 9, 8, 15, 14, 13, 12, 3, 2, 1, 0, 7, 6, 5, 4],
[12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3],
[13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2],
[14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1],
[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]]
Mult. Identity: '1:1'
Mult. Commutative? Yes
Zero Divisors: ['0:1', '0:a', '0:1+a', '1:0', 'a:0', '1+a:0']
Multiplicative Cayley Table (showing indices):
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3],
[0, 2, 3, 1, 0, 2, 3, 1, 0, 2, 3, 1, 0, 2, 3, 1],
[0, 3, 1, 2, 0, 3, 1, 2, 0, 3, 1, 2, 0, 3, 1, 2],
[0, 0, 0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, 12, 12, 12],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[0, 2, 3, 1, 4, 6, 7, 5, 8, 10, 11, 9, 12, 14, 15, 13],
[0, 3, 1, 2, 4, 7, 5, 6, 8, 11, 9, 10, 12, 15, 13, 14],
[0, 0, 0, 0, 8, 8, 8, 8, 12, 12, 12, 12, 4, 4, 4, 4],
[0, 1, 2, 3, 8, 9, 10, 11, 12, 13, 14, 15, 4, 5, 6, 7],
[0, 2, 3, 1, 8, 10, 11, 9, 12, 14, 15, 13, 4, 6, 7, 5],
[0, 3, 1, 2, 8, 11, 9, 10, 12, 15, 13, 14, 4, 7, 5, 6],
[0, 0, 0, 0, 12, 12, 12, 12, 4, 4, 4, 4, 8, 8, 8, 8],
[0, 1, 2, 3, 12, 13, 14, 15, 4, 5, 6, 7, 8, 9, 10, 11],
[0, 2, 3, 1, 12, 14, 15, 13, 4, 6, 7, 5, 8, 10, 11, 9],
[0, 3, 1, 2, 12, 15, 13, 14, 4, 7, 5, 6, 8, 11, 9, 10]]
The scalar and vector components of the Vector Space just created can be accessed as follows:
>>> vs.scalar
Field(
'F4',
'Field with 4 elements (from Wikipedia)',
('0', '1', 'a', '1+a'),
[[0, 1, 2, 3], [1, 0, 3, 2], [2, 3, 0, 1], [3, 2, 1, 0]],
[[0, 0, 0, 0], [0, 1, 2, 3], [0, 2, 3, 1], [0, 3, 1, 2]]
)
>>> vs.vector
Ring(
'F4_x_F4',
'Direct product of F4 & F4',
('0:0', '0:1', '0:a', '0:1+a', '1:0', '1:1', '1:a', '1:1+a', 'a:0', 'a:1', 'a:a', 'a:1+a', '1+a:0', '1+a:1', '1+a:a', '1+a:1+a'),
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], [1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14], [2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13], [3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12], [4, 5, 6, 7, 0, 1, 2, 3, 12, 13, 14, 15, 8, 9, 10, 11], [5, 4, 7, 6, 1, 0, 3, 2, 13, 12, 15, 14, 9, 8, 11, 10], [6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9], [7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8], [8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7], [9, 8, 11, 10, 13, 12, 15, 14, 1, 0, 3, 2, 5, 4, 7, 6], [10, 11, 8, 9, 14, 15, 12, 13, 2, 3, 0, 1, 6, 7, 4, 5], [11, 10, 9, 8, 15, 14, 13, 12, 3, 2, 1, 0, 7, 6, 5, 4], [12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3], [13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2], [14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1], [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]],
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], [0, 2, 3, 1, 0, 2, 3, 1, 0, 2, 3, 1, 0, 2, 3, 1], [0, 3, 1, 2, 0, 3, 1, 2, 0, 3, 1, 2, 0, 3, 1, 2], [0, 0, 0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, 12, 12, 12], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], [0, 2, 3, 1, 4, 6, 7, 5, 8, 10, 11, 9, 12, 14, 15, 13], [0, 3, 1, 2, 4, 7, 5, 6, 8, 11, 9, 10, 12, 15, 13, 14], [0, 0, 0, 0, 8, 8, 8, 8, 12, 12, 12, 12, 4, 4, 4, 4], [0, 1, 2, 3, 8, 9, 10, 11, 12, 13, 14, 15, 4, 5, 6, 7], [0, 2, 3, 1, 8, 10, 11, 9, 12, 14, 15, 13, 4, 6, 7, 5], [0, 3, 1, 2, 8, 11, 9, 10, 12, 15, 13, 14, 4, 7, 5, 6], [0, 0, 0, 0, 12, 12, 12, 12, 4, 4, 4, 4, 8, 8, 8, 8], [0, 1, 2, 3, 12, 13, 14, 15, 4, 5, 6, 7, 8, 9, 10, 11], [0, 2, 3, 1, 12, 14, 15, 13, 4, 6, 7, 5, 8, 10, 11, 9], [0, 3, 1, 2, 12, 15, 13, 14, 4, 7, 5, 6, 8, 11, 9, 10]]
)
And the scalar and vector elements of the VectorSpace can be obtained as follows:
>>> vs.scalar.elements
('0', '1', 'a', '1+a')
>>> vs.vector.elements
('0:0',
'0:1',
'0:a',
'0:1+a',
'1:0',
'1:1',
'1:a',
'1:1+a',
'a:0',
'a:1',
'a:a',
'a:1+a',
'1+a:0',
'1+a:1',
'1+a:a',
'1+a:1+a')
Scalar addition and multiplication is just the addition and multiplication operations of the Field (Scalars) used to create the VectorSpace (or Module)
>>> vs.scalar.add('1', 'a')
'1+a'
>>> vs.scalar.mult('a', 'a')
'1+a'
Vector addition is just the binary operation of the Group (Vectors) used to create the Vector Space (or Module)
>>> vs.vector_add('1+a:1', '1:a') # Same as vs.vector.op('1+a:1', '1:a')
'a:1+a'
And, since the scalar part of a VectorSpace is a Field, we can obtain it’s identity elements as follows:
>>> vs.scalar.zero
'0'
>>> vs.scalar.one
'1'
The scalar-vector operation for scaling Vectors (or Modules) is the
VectorSpace method, sv_mult, and takes two inputs: a scalar and
vector, resp.
>>> vs.sv_mult('a', '1+a:1')
'1:a'
VectorSpace/Module Conditions
Recall the five conditions imposed a VectorSpace or Module (listed below):
Scaled Vectors: For all \(s \in S\) and \(v \in V \Rightarrow s \circ v \in V\)
Scaling by One: If \(1 \in S\) is the multiplicative identity element of \(F\), then \(1 \circ v = v\)
Distributivity of Scalars Over Vector Addition: \(s \circ (v_1 \oplus v_2) = (s \circ v_1) \oplus (s \circ v_2)\)
Distributivity of Vectors Over Scalar Addition: \((s_1 + s_2) \circ v = (s_1 \circ v) \oplus (s_2 \circ v)\)
Scalar-Vector Associativity: \(s_1 \circ (s_2 \circ v) = (s_1 \cdot s_2) \circ v\)
The following five sections provide examples that illustrate each condition.
1. Scaled Vectors
>>> s = 'a'
>>> v = 'a:a'
>>> sv = vs.sv_mult(s, v)
>>> print(f"sv = {s} * {v} = {vs.sv_mult(s, v)}")
>>> print(f"Is sv a vector? {sv in vs.vector.elements}")
sv = a * a:a = 1+a:1+a
Is sv a vector? True
2. Scaling by One
If \(\mathscr{1} \in S\) is the multiplicative identity element of \(\mathscr{F}\), then \(\mathscr{1} \circ v = v\)
>>> print(vs.sv_mult(vs.scalar.one, 'a:1+a'))
a:1+a
3. Distributivity of Scalars Over Vector Addition
\(s \circ (v_1 \oplus v_2) = (s \circ v_1) \oplus (s \circ v_2)\)
>>> s = 'a'
>>> v1 = 'a:1+a'
>>> v2 = 'a:1'
\(s \circ (v_1 \oplus v_2)\)
>>> print(vs.sv_mult(s, vs.vector_add(v1, v2)))
0:1+a
\((s \circ v_1) \oplus (s \circ v_2)\)
>>> print(vs.vector_add(vs.sv_mult(s, v1), vs.sv_mult(s, v2)))
0:1+a
4. Distributivity of Vectors Over Scalar Addition
\((s_1 + s_2) \circ v = (s_1 \circ v) \oplus (s_2 \circ v)\)
>>> s1 = 'a'
>>> s2 = '1+a'
>>> v = 'a:1'
\((s_1 + s_2) \circ v\)
>>> print(vs.sv_mult(vs.scalar.add(s1, s2), v))
a:1
\((s_1 \circ v) \oplus (s_2 \circ v)\)
>>> print(vs.vector_add(vs.sv_mult(s1, v), vs.sv_mult(s2, v)))
a:1
5. Scalar-Vector Associativity
\(s_1 \circ (s_2 \circ v) = (s_1 \times s_2) \circ v\)
>>> s1 = 'a'
>>> s2 = '1+a'
>>> v = 'a:1'
\(s_1 \circ (s_2 \circ v)\)
>>> print(vs.sv_mult(s1, vs.sv_mult(s2, v)))
a:1
\((s_1 \times s_2) \circ v\)
>>> print(vs.sv_mult(vs.scalar.mult(s1, s2), v))
a:1
A Finite, n-Dimensional Module
Here’s another example using the technique presented above, but this time with a Ring instead of a Field.
First, the Ring:
>>> from finite_algebras import generate_powerset_ring
>>> psr2 = generate_powerset_ring(2)
>>> psr2.about()
** Ring **
Name: PSRing2
Instance ID: 4693521616
Description: Autogenerated Ring on powerset of {0, 1} w/ symm. diff. (add) & intersection (mult)
Order: 4
Identity: '{}'
Commutative? Yes
Cyclic?: No
Elements:
Index Name Inverse Order
0 '{}' '{}' 1
1 '{0}' '{0}' 2
2 '{1}' '{1}' 2
3 '{0, 1}' '{0, 1}' 2
Cayley Table (showing indices):
[[0, 1, 2, 3], [1, 0, 3, 2], [2, 3, 0, 1], [3, 2, 1, 0]]
Mult. Identity: '{0, 1}'
Mult. Commutative? Yes
Zero Divisors: ['{0}', '{1}']
Multiplicative Cayley Table (showing indices):
[[0, 0, 0, 0], [0, 1, 0, 1], [0, 0, 2, 2], [0, 1, 2, 3]]
And here’s the finite, n-dimensional Module based on the Ring, above:
>>> from finite_algebras import NDimensionalModule
>>> n = 2
>>> psr_mod = NDimensionalModule(psr2, n)
>>> psr_mod.about(max_size=16)
NDimensionalModule: 2D-PSRing2
Instance ID: 4694007424
Description: 2-dimensional Module over PSRing2
SCALARS:
** Ring **
Name: PSRing2
Instance ID: 4693521616
Description: Autogenerated Ring on powerset of {0, 1} w/ symm. diff. (add) & intersection (mult)
Order: 4
Identity: '{}'
Commutative? Yes
Cyclic?: No
Elements:
Index Name Inverse Order
0 '{}' '{}' 1
1 '{0}' '{0}' 2
2 '{1}' '{1}' 2
3 '{0, 1}' '{0, 1}' 2
Cayley Table (showing indices):
[[0, 1, 2, 3], [1, 0, 3, 2], [2, 3, 0, 1], [3, 2, 1, 0]]
Mult. Identity: '{0, 1}'
Mult. Commutative? Yes
Zero Divisors: ['{0}', '{1}']
Multiplicative Cayley Table (showing indices):
[[0, 0, 0, 0], [0, 1, 0, 1], [0, 0, 2, 2], [0, 1, 2, 3]]
VECTORS:
** Ring **
Name: PSRing2_x_PSRing2
Instance ID: 4693520656
Description: Direct product of PSRing2 & PSRing2
Order: 16
Identity: '{}:{}'
Commutative? Yes
Cyclic?: No
Elements:
Index Name Inverse Order
0 '{}:{}' '{}:{}' 1
1 '{}:{0}' '{}:{0}' 2
2 '{}:{1}' '{}:{1}' 2
3 '{}:{0, 1}' '{}:{0, 1}' 2
4 '{0}:{}' '{0}:{}' 2
5 '{0}:{0}' '{0}:{0}' 2
6 '{0}:{1}' '{0}:{1}' 2
7 '{0}:{0, 1}' '{0}:{0, 1}' 2
8 '{1}:{}' '{1}:{}' 2
9 '{1}:{0}' '{1}:{0}' 2
10 '{1}:{1}' '{1}:{1}' 2
11 '{1}:{0, 1}' '{1}:{0, 1}' 2
12 '{0, 1}:{}' '{0, 1}:{}' 2
13 '{0, 1}:{0}' '{0, 1}:{0}' 2
14 '{0, 1}:{1}' '{0, 1}:{1}' 2
15 '{0, 1}:{0, 1}' '{0, 1}:{0, 1}' 2
Cayley Table (showing indices):
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14],
[2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13],
[3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12],
[4, 5, 6, 7, 0, 1, 2, 3, 12, 13, 14, 15, 8, 9, 10, 11],
[5, 4, 7, 6, 1, 0, 3, 2, 13, 12, 15, 14, 9, 8, 11, 10],
[6, 7, 4, 5, 2, 3, 0, 1, 14, 15, 12, 13, 10, 11, 8, 9],
[7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8],
[8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7],
[9, 8, 11, 10, 13, 12, 15, 14, 1, 0, 3, 2, 5, 4, 7, 6],
[10, 11, 8, 9, 14, 15, 12, 13, 2, 3, 0, 1, 6, 7, 4, 5],
[11, 10, 9, 8, 15, 14, 13, 12, 3, 2, 1, 0, 7, 6, 5, 4],
[12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3],
[13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2],
[14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1],
[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]]
Mult. Identity: '{0, 1}:{0, 1}'
Mult. Commutative? Yes
Zero Divisors: ['{}:{0}', '{}:{1}', '{}:{0, 1}', '{0}:{}', '{0}:{0}', '{0}:{1}', '{0}:{0, 1}', '{1}:{}', '{1}:{0}', '{1}:{1}', '{1}:{0, 1}', '{0, 1}:{}', '{0, 1}:{0}', '{0, 1}:{1}']
Multiplicative Cayley Table (showing indices):
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2],
[0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3],
[0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4],
[0, 1, 0, 1, 4, 5, 4, 5, 0, 1, 0, 1, 4, 5, 4, 5],
[0, 0, 2, 2, 4, 4, 6, 6, 0, 0, 2, 2, 4, 4, 6, 6],
[0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7],
[0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8],
[0, 1, 0, 1, 0, 1, 0, 1, 8, 9, 8, 9, 8, 9, 8, 9],
[0, 0, 2, 2, 0, 0, 2, 2, 8, 8, 10, 10, 8, 8, 10, 10],
[0, 1, 2, 3, 0, 1, 2, 3, 8, 9, 10, 11, 8, 9, 10, 11],
[0, 0, 0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, 12, 12, 12],
[0, 1, 0, 1, 4, 5, 4, 5, 8, 9, 8, 9, 12, 13, 12, 13],
[0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]]