(圣人)
#用Sage编写的程序
#如果给定的n n X n ASM列表构成ASHM,则返回True,否则返回False
定义ASHM(L):
n=长度(L)
#通过超矩阵位置(i,j)的垂直线搜索每个i和j
对于范围(n)内的i:
对于范围(n)中的j:
#由于ASHM每行中的第一个非零条目为+1,因此检查交替条件
#就好像前面的非零条目是-1
最后=-1
对于范围(n)中的k:
#在当前垂直线的每个位置,如果当前条目的符号相反
#上一个,则更新上一个标志
如果L[k][i,j]*last==-1:
最后*=-1
#否则返回False,除非当前条目为0
elif L[k][i,j]!=0:
返回False
#如果在检查所有条目时,最近的非零条目不是+1,则返回False
如果最后!=1:
返回False
#如果未返回False,则返回True
return True
#从L中的每个列表生成一个元素的所有组合
定义组合框(L,current=[[]]):
#如果没有未组合的元素,则返回已进行的组合
如果长度(L)==0:
回流
#否则,L中下一个列表的每个元素都会附加到当前组合列表中
输出=[]
对于电流中的K:
对于L[0]中的a:
output.append(K+[a])
返回组合框(L[1:],输出)
#统计n阶的所有ASHM
定义count_ASHM(n):
#n阶的所有ASM都作为矩阵导入
asms=[]
对于AlternatingSignMatrices(n)中的A:
asms.append(A.to_matrix())
#最初,统计的ASHM为零
计数=0
#检查n n X n ASM的每个可能组合
对于组合框中的i([[k表示范围中的k(len(asms))]表示范围(n)中的m):
#如果n n X n ASM的当前列表形成ASHM,则对其进行计数
count+=int(ASHM(范围(n)中k的[asms[i[k]]))
#返回最终计数
返回计数
#注意:我在Python中运行了这个程序的一个更高效的版本,以获得n=5的答案,即使这样也花了6个小时。
打印(count_ASHM(0))
打印(count_ASHM(1))
打印(count_ASHM(2))
打印(count_ASHM(3))
打印(count_ASHM(4))
打印(count_ASHM(5))
|