latex.matrix_delimiters("[", "]")
latex.matrix_column_alignment("c")
class rowOp(SageObject):
def __init__(self,optype,row1, row2, scalar=1):
self.row1=str(row1)
self.row2 = str(row2)
self.optype=optype
self.scalar = str(scalar)
if self.optype == "elementary":
self.string = "R_"+self.row1 + r" \to " + "R_"+self.row1 + r" + " + self.scalar + "R_"+self.row2
if self.optype=="diagonal":
self.string = "R_"+self.row1 + r" \to " + self.scalar + "R_"+self.row1
if self.optype=="permutation":
self.string = "R_"+self.row1 + r" \leftrightarrow " + "R_"+self.row2
def _latex_(self):
return self.string
class setBuilder(SageObject):
def __init__(self, element=None, predicate=None):
self.element=element
self.predicate=predicate
def _latex_(self):
if self.element==None:
return r"\left\{\right\}"
string=r"\left\{"+latex(self.element)
if self.predicate==None:
string+=r"\right\}"
else:
string+=r"\middle|\,"+"".join([latex(p) for p in self.predicate])+r"\right\}"
return string
class bracedSet(SageObject):
def __init__(self,list):
self.list=list
def _latex_(self):
string=r"\left\{"
for i in range(0,len(self.list)-1):
string+= latex(self.list[i])+","
string+= latex(self.list[-1])+r"\right\}"
return string
class vectorSet(bracedSet):
def __init__(self,vectors):
self.list=[column_matrix(v) for v in vectors]
class vectorList(SageObject):
def __init__(self,vectors):
self.vecList=[column_matrix(v) for v in vectors]
def _latex_(self):
string=""
for i in range(0,len(self.vecList)-1):
string+= latex(self.vecList[i])+","
string+= r"\text{ and }" + latex(self.vecList[-1])
return string
class linearCombination(SageObject):
def __init__(self,coeffs,vecs,parentheses=false):
self.coefficients=[]
self.vectors=[]
self.length=min(len(coeffs),len(vecs))
for i in range(0,self.length):
self.coefficients.append(coeffs[i])
self.vectors.append(vecs[i])
self.parentheses=parentheses
def _latex_(self):
string=""
for i in range(0,self.length-1):
string+= latex(self.coefficients[i])
if self.parentheses:
string+= r"\left("+latex(self.vectors[i])+r"\right)"
else:
string+=latex(self.vectors[i])
string+="+"
string+= latex(self.coefficients[-1])
if self.parentheses:
string+= r"\left("+latex(self.vectors[-1])+r"\right)"
else:
string+=latex(self.vectors[-1])
return string
class Equation(SageObject):
def __init__(self,leftside,rightside):
self.lhs = leftside
self.rhs = rightside
def _latex_(self):
return latex(self.lhs)+"="+latex(self.rhs)
class vectorEquation(Equation):
def __init__(self,A,vars=None):
self.matrix=A
if not self.matrix.subdivisions()[1]:
self.matrix=self.matrix.augment(zero_vector(ZZ, len(self.matrix.columns())), subdivide=true)
if not vars:
vars = vector([var("x_"+str(i+1)) for i in range(0,len(self.matrix.subdivision(0,0).columns()))])
super().__init__(linearCombination(vars,[column_matrix(c) for c in self.matrix.subdivision(0,0).columns()]), column_matrix(A.column(-1)))
class systemEquations:
def __init__(self,A,vars=None):
self.matrix=A
if not self.matrix.subdivisions()[1]:
self.matrix=self.matrix.augment(zero_vector(ZZ, len(self.matrix.rows())), subdivide=true)
if not vars:
self.vars = vector([var("x_"+str(i+1)) for i in range(0,self.matrix.subdivision(0,0).ncols())])
else:
self.vars = vars[0: self.matrix.subdivision(0,0).ncols()]
self.equations=[]
for row in self.matrix.rows():
eqstring=""
rowCopy=copy(row)
leadingZeros=true
for i in range(0,len(self.vars)):
eqstring+= latex(rowCopy[i] * self.vars[i]) if rowCopy[i] else ""
if not(leadingZeros and rowCopy[i]==0):
leadingZeros=false
if i < len(self.vars)-1:
if rowCopy[i+1]<0:
rowCopy[i+1]*=-1
eqstring+=" &-& "
elif rowCopy[i+1]>0 and not leadingZeros:
eqstring+=" &+& "
else:
eqstring+=" & & "
if leadingZeros:
eqstring+="0"
eqstring+= " &=& " + latex(row[len(self.vars)])
self.equations.append(LatexExpr(eqstring))
def _latex_(self):
return self.equations