# Using sage to check if a vector is in a matrix's null space

I want to check if a given vector is inside a matrix's null space.

Here is what I have done:

#Define a matrix
A=Matrix([[1,-1,2,-1],[2,1,-2,-2],[-1,2,-4,1],[3,0,0,-3]],ring=QQ)

#Free variables to be used in the given vector
var('s t')

#The null space of the matrix A
ns=A.kernel()

s=2
t=1

#Create a vector
ans=s*vector([1,0,0,1])+t*vector([0,2,1,0])

#If ans is in the null space of A, then A*ans is the 0 vector
print A*ans

#If A*ans is the 0 vector, then the following should be true too
print ans in ns


I had expected the last print statement to be true since A*ans results in a zero vector, hence ans is in the null space of A.

Why isn't this the case?

edit retag close merge delete

Sort by » oldest newest most voted Your vector ans is not in A.kernel() because of how A.kernel() is defined. From its documentation:

Returns the left kernel of this matrix, as a vector space or free
module. This is the set of vectors "x" such that "x*self = 0".

Note: For the right kernel, use "right_kernel()".  The method
"kernel()" is exactly equal to "left_kernel()".


So since ans * A is not zero, ans is not in A.kernel().

sage: ans in A.kernel()
False
sage: ans in A.right_kernel()
True


A.right_kernel() is what you want.

more

Actually, the .kernel() method corresponds to the left kernel. What you are looking for is the right kernel:

sage: ns = A.right_kernel()
sage: ans in ns
True

more