(PARI)/*示例a(n)<1/10*n^4+48*n^3+1299/10*n^2+4*n。
为了得到显式矩阵解,调用F(n);
这也会检查矩阵是否是一个好的解决方案*/
c(x,y,n)={如果
F(n)={A=矩阵;
对于(j=2,n-1,A[1,j]+=(j-1)*n;A[n,j]+=(j-1)*n);
对于(i=2,n-1,A[i,1]+=(i-1)*n;A[i,n]+=(i-1)*n);
my(S=矩阵(n,n),w=向量(n^2),dx=[0,1,-1,0,0],dy=[0、0、0、1,-1],ans=0);
对于(i=1,n,对于(j=1,n,ans+=A[i,j];对于(h=1,5,x=i+dx[h];y=j+dy[h]);
如果(x>0&&x<=n&y>0&y<=n,S[i,j]+=A[x,y]);w[n*(i-1)+j]=S[i,j]));
如果(长度(设置(w))<n^2,0,打印(ans);A) }
(PARI)/*如果矩阵M不是解,则返回0,否则元素之和始终>0,M=(0)除外。第二个参数指定邻里关系,请参见下文*/
score(M,N=vN(#M),U=[])={M=concat(Vec(M));对于(i=1,#N,#U<#(U=setunion(U,[vecsum(vecextract(M,N[i]))]))||return);vecsum(M)}
/*下面的函数vN()计算标记为1..n^2的每个单元格的von Neumann邻域列表。(对于score()的重复调用,应该计算一次,存储并作为第二个参数提供。)*/
vN(n)=向量(n^2,i,[c|c<-[i,i-n,如果(i%n!=1,i-1),如果(i%n,i+1),如果[i<=n^2-n,i+n)],c>0])
/*a(n)的强力计算,对于n>=4不可行。可选参数:冗长(显示越来越好的解决方案)、邻域、元素的下限和上限、目标值(如果找到则停止)*/
{a(n,verbose=1,n=vN(n),o=0,L=n^2\2+(n==2),T=(n^4-n^2+23)\10+(3<n&&n<6),m=n^4-1+o)=n>1&&forvec(m=向量(#n,i,[o,if(i>n|n==2,min(i,L))]),my(s=分数(m,n));if(s&s<m,m=s;verbose&printf(“s%d=%d,“,m,s);m<=T&&break));m}\\M.F.哈斯勒2021年1月15日