load("__common__.sage")
def generator():
columns = randrange(3,4)
rows = 7-columns
A = random_matrix(QQ,rows,columns,algorithm='echelonizable',rank=min(rows,columns)-1,upper_bound=9)
xs=choice([
column_matrix(vector([var("x_"+str(i+1)) for i in range(0,columns)])),
column_matrix(vector([var("x"),var("y"),var("z"),var("zw",latex_name="w")][0:columns])),
])
free_vars = [var("a"), var("b"), var("c"), var("d")]
kernelbasis=A.right_kernel(basis='pivot').basis()
solutions = column_matrix(zero_vector(ZZ, len(A.columns())))
predicate = []
for v in kernelbasis:
free_var = free_vars.pop(0)
predicate.append(free_var)
predicate.append(",")
solutions += free_var*column_matrix(v)
if (len(predicate) > 0):
predicate.pop()
predicate.append(LatexExpr(r"\in\mathbb{R}"))
kernel = setBuilder(solutions,predicate)
else:
kernel = setBuilder(solutions)
imagebasis=[A.column(i) for i in A.pivots()]
return {
"columns": columns,
"rows": rows,
"Tvar": A*xs,
"varvector": xs,
"matrix": A,
"rref": A.rref(),
"imagebasis": vectorSet(imagebasis),
"kernelbasis": vectorSet(kernelbasis),
"kernel": kernel,
"rank": len(imagebasis),
"nullity": len(kernelbasis)
}