线性代数相关脚本
前言注意事项
函数本身基本上是配合使用的,所以请注意这一点。
求矩阵行列式
def det_element(arr,now,posi,level,sym,n):
#now:目前的值,posi:状压标号,level:层数,sym:当前逆序数的值
if level== n :
if sym : return -now
else:return now
res=0
for i in range(n):
if (1<<i)&posi:
continue
mid=posi>>i
tmpsym=sym
while mid:
tmpsym+=1
mid-=mid&(-mid)
tmpsym%=2
res+=det_element(arr,now*arr[level][i],posi|(1<<i),level+1,tmpsym,n)
return res
def getdet(arr,n):#arr:矩阵,n矩阵阶数
res=0
for i in range(n):
res+=det_element(arr,arr[0][i],1<<i,1,0,n)#递归求解
return res
求伴随矩阵
def getAdjugate(arr,n):
res=[[]for x in range(n)]
for i in range(n):
for j in range(n):
tmparr=[[]for x in range(n-1)]
flag=0
for m in range(n):
if m==i:
flag=1
continue
for k in range(n):
if k==j:continue
tmparr[m-flag].append(arr[m][k])
if (i+j)%2:
res[j].append(-getdet(tmparr,n-1))
else:
res[j].append(getdet(tmparr,n-1))
return res
求逆矩阵
def getrev(arr,n):
Adjugate=getAdjugate(arr,n)
det=getdet(arr,n)
res=[[]for x in range(n)]
for i in range(n):
for j in range(n):
res[i].append(Adjugate[i][j]/det)
return res