load("__common__.sage")
def generator():
rows = randrange(3,5)
columns = 8-rows
max_number_of_pivots = min(rows,columns)
number_of_pivots = randrange(2,max_number_of_pivots+1)
A = random_matrix(QQ,rows,columns,algorithm='echelonizable',rank=number_of_pivots,upper_bound=9)
A.subdivide([],[columns-1])
xs=vector([var("x_"+str(i+1)) for i in range(0,columns-1)])
system=[A.delete_columns([columns-1]).row(r)*xs==A.column(-1)[r] for r in range(0,rows)]
prompt = choice(["system","vectoreq"])
rref = copy(A.echelon_form())
rref.subdivide([],[columns-1])
constants = rref.column(-1)
free_vars = [var("a"), var("b"), var("c"), var("d")]
if columns-1 in A.pivots():
solset=setBuilder()
else:
part_sol = []
abbr_part_sol = list(rref.column(-1))
for i in range(0,columns-1):
if i in A.pivots():
part_sol.append(abbr_part_sol.pop(0))
else:
part_sol.append(0)
sol = column_matrix(QQ,part_sol)
predicate = []
for v in A.delete_columns([columns-1]).right_kernel(basis='pivot').basis():
free_var = free_vars.pop(0)
predicate.append(free_var)
predicate.append(",")
sol += free_var*column_matrix(v)
if (len(predicate) > 0):
predicate.pop()
predicate.append(LatexExpr(r"\in\mathbb{R}"))
solset = setBuilder(sol,predicate)
else:
infinite = False
solset = setBuilder(sol)
return {
'system': systemEquations(A).equations,
'alignCols': A.ncols(),
'matrix': A,
'rref': rref,
'solution': solset,
'prompt': prompt,
'vectoreq': vectorEquation(A)
}