This may be more of a work-in-progress than a formal SEP, but I\'m not sure where else to put it.

Basically, we now have inconsistency of what functions are defined for what matrix types. This makes things confusing to students, for example; when they are doing a problem, often a matrix will be coerced into a new type, which then has a different set of functions.

We should also carefully look at the eig* functions in each datatype and make sure that the interface is consistent and that the eigenvalues/vectors/spaces/matrices are computed in the appropriate way.

These methods are fine the way they are now:

method

Integer Ring

Rational Field

Real Field with 53 bits of precision

Complex Field with 53 bits of precision

Real Double Field

Complex Double Field

Symbolic Ring

BKZ

TRUE

LLL

TRUE

LLL_gram

TRUE

add_multiple_of_column

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

add_multiple_of_row

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

apply_map

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

apply_morphism

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

arguments

TRUE

change_ring

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

column

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

column_module

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

columns

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

commutator

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

copy

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

db

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Is this used??

dense_columns

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

dense_matrix

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

dense_rows

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

det

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

determinant

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

dict

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

dump

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

dumps

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

These methods still need to be combed through to see if something needs to be done.

method

Integer Ring

Rational Field

Real Field with 53 bits of precision

Complex Field with 53 bits of precision

Real Double Field

Complex Double Field

Symbolic Ring

expand

TRUE

factor

TRUE

fcp

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

find

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

frobenius

TRUE

gcd

TRUE

get_subdivisions

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

gram_schmidt

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

hadamard_bound

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

height

TRUE

TRUE

hermite_form

TRUE

hessenberg_form

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

hessenbergize

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

image

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

index_in_saturation

TRUE

insert_row

TRUE

integer_kernel

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

inverse

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

invert

TRUE

is_LLL_reduced

TRUE

is_dense

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

is_immutable

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

is_invertible

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

is_mutable

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

is_nilpotent

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

is_one

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

is_scalar

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

is_simplified

TRUE

is_sparse

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

is_square

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

is_symmetric

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

is_unit

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

is_zero

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

iterates

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

jordan_form

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

kernel

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

kernel_matrix

TRUE

kernel_on

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

left_eigenmatrix

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

left_eigenvectors

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

left_kernel

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

left_nullity

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

lift

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

linear_combination_of_columns

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

linear_combination_of_rows

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

list

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

log_determinant

TRUE

TRUE

matrix_from_columns

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

matrix_from_rows

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

matrix_from_rows_and_columns

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

matrix_over_field

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

matrix_space

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

matrix_window

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

maxspin

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

minimal_polynomial

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

minors

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

minpoly

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

mod

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

multiplicative_order

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

n

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

ncols

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

new_matrix

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

nonpivots

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

nonzero_positions

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

nonzero_positions_in_column

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

nonzero_positions_in_row

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

norm

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

nrows

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

nullity

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

number_of_arguments

TRUE

numerical_approx

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

numpy

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

order

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

parent

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

permanent

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

permanental_minor

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

pivot_rows

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

pivots

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

plot

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

prod_of_row_sums

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

randomize

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

rank

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

rational_reconstruction

TRUE

rename

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

rescale_col

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

rescale_row

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

reset_name

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

restrict

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

restrict_codomain

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

restrict_domain

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

right_eigenmatrix

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

right_eigenspaces

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

right_eigenvectors

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

right_kernel

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

right_nullity

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

rook_vector

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

row

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

row_module

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

row_space

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

rows

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

saturation

TRUE

save

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

set_block

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

set_col_to_multiple_of_col

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

set_column

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

set_immutable

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

set_row

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

set_row_to_multiple_of_row

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

simplify

TRUE

simplify_rational

TRUE

simplify_trig

TRUE

smith_form

TRUE

solve_left

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

solve_left_LU

TRUE

TRUE

solve_right

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

sparse_columns

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

sparse_matrix

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

sparse_rows

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

stack

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

str

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

subdivide

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

subdivision

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

subdivision_entry

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

subdivisions

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

submatrix

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

subs

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

substitute

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

swap_columns

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

swap_rows

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

symplectic_form

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

tensor_product

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

trace

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

transpose

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

variables

TRUE

version

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

visualize_structure

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

wiedemann

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

with_added_multiple_of_column

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

with_added_multiple_of_row

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

with_col_set_to_multiple_of_col

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

with_rescaled_col

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

with_rescaled_row

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

with_row_set_to_multiple_of_row

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

These functions are on the todo list.

method

Integer Ring

Rational Field

Real Field with 53 bits of precision

Complex Field with 53 bits of precision

Real Double Field

Complex Double Field

Symbolic Ring

TODO

LU

TRUE

TRUE

LU_valid

TRUE

TRUE

QR

TRUE

TRUE

SVD

TRUE

TRUE

abs

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Make it clear that this returns the determinant

act_on_polynomial

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Does not deal with symbolic polynomials

additive_order

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Is this implemented for any matrix

adjoint

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Rename to adjugate, deprecate this function. Later, define this function to be the conjugate transpose

antitranspose

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Define antitranspose in the docs

augment

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Make it clear that other will be coerced to a matrix over self.base_ring(). Maybe this should be changed so that the returned matrix is of a type that both matrices can be coerced to?

base_extend

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

No documentation

base_ring

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

No documentation

block_sum

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Same comment as augment above. In fact, fixing augment may fix this.

category

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

No documentation

characteristic_polynomial

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Docs point to charpoly, but in reality, the long name should have all the docs and charpoly should just be an alias

charpoly

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

No documentation explaining the characteristic polynomial.

cholesky

TRUE

TRUE

column_space

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Make this just an alias for column_module. In fact, we might deprecate this, since currently it says it returns a vector space for an integer matrix, for example, but does not (returns a free module).

conjugate

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Does not work for integer matrices (see #4494). Maybe we need to coerce to complex numbers first?

decomposition

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Doesn't work for SR matrices

decomposition_of_subspace

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Doesn't work for SR matrices?

denominator

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Doesn't work for SR matrices

density

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

typo in docstring "ration" -> "ratio"

derivative

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Doesn't work for integer matrices (need to define a derivative function for numeric constants?)

echelon_form

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Implement #3211

echelonize

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Implement #3211

eigenmatrix_left

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

For all the eigenfunctions below, make sure that the return values are consistent across rings.

eigenmatrix_right

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

eigenspaces

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

eigenspaces_left

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

eigenspaces_right

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

eigenvalues

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

eigenvectors_left

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Implement #4834

eigenvectors_right

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

TRUE

Implement #4834

elementary_divisors

TRUE

Doesn't work over SR matrices; apparently this function was expanded in 3.2.2 to work over more matrices.

exp

#4733

#4733

#4733

#4733

#4733

#4733

TRUE

I got this from this code:

import inspect
rings = [ZZ,QQ,RR,CC,RDF,CDF,SR]

ring_methods = {}

for r in rings:
    ring_methods[r] = set([method for method,_ in inspect.getmembers(matrix(r)) if not method.startswith('_')])

# Get a comprehensive list of names.
full_list = set([])

for r in rings:
    full_list.update(ring_methods[r])

full_list = sorted(list(full_list))

s = '|| method || '
s += ' || '.join([repr(r) for r in rings])+' ||'
print s

for method in full_list:
    s = "|| "+ method+" || "
    s += ' || '.join(['TRUE' if method in ring_methods[r] else '' for r in rings])
    s += ' ||'
    print s