7 1 5 3
9 8 0 8 9
3 5 1 7
6 4 2 7# hujunhua
k解出来了,k==38 用Mathematica会内存不够,用C写了个
#include <stdio.h>
#include <time.h>
int main(int argc, char *argv[])
{
clock_t t0=clock();
int a,b,c,d,e,f,g;
int k=19;
for (a=1;a<=k;a++)
for (b=1;b<=k;b++)
for (c=1;c<=k;c++)
for (d=1;d<=k;d++)
for (e=1;e<=k;e++)
for (f=1;f<=k;f++)
for (g=1;g<=k;g++)
{
int A;
A = a;
A = b;
A = 38 - a - b;
A = c;
A = d;
A = e;
A = 38 - c - d - e;
A = 38 - a - c;
A = f;
A = g;
A = 38 - b - d - e - f - g;
A = -38 + a + b + c + d + e;
A = 38 - b - d - f;
A = 38 - c - d - e - f - g;
A = -38 + b + c + d + e + f;
A = d + f + g;
A = -38 + a + b + c + d + f;
A = d + e + g;
A = 76 - a - b - c - 2*d - e - f - g;
int i, j;
int flag1=1;
for (i=0;i<k;i++)
{
if (!(A>0))
{
flag1=0;
break;
}
}
if (!flag1)
break;
int flag2=1;
for (i=0; i<k;i++)
{
for (j=1; j<k-i;j++)
{
if (A==A)
{
flag2=0;
break;
}
}
}
if (flag2)
{
for (i=0;i<k;i++)
printf("%d ", A);
printf("\n");
}
}
printf ("Elapsed %0.2f\n", (clock()-t0)/1000.0);
getchar();
return 0;
}
本质上就是 一个 16*19的常数矩阵C,乘以19*1的列向量X,得到一个16*1的列向量A=k*{1,1,1,1,1,....,1,5}
其中,5k=19*20/2------------------------------>也即是 k=38 5# hujunhua
Binomial=27132 ,
也就是说总共只需要循环27132 次,每一次解13*13的线性方程,这个规模其实很小,基本上不费时间的。
老大说的超过“机器数”是啥意思? 15# wayne
我觉得是可能是生成的list太大,Mathematica报内存溢出了 5# hujunhua
(x1,x2,x3,x4,x5,x6),(i=7~19)取自6个无约束关系的格。
这6个格子代表6个自由度,选择这样的格子还是比较难的。
该不会是2,4,13,18,16,7 吧 b1={{1,2,3},{4,5,6,7},{8,9,10,11,12},{13,14,15,16},{17,18,19}};
b2={{1,4,8},{2,5,9,13},{3,6,10,14,17},{7,11,15,18},{12,16,19}};
b3={{3,7,12},{2,6,11,16},{1,5,10,15,19},{4,9,14,18},{8,13,17}};
cc=Table;Map,1]&,iii];t,{iii,Flatten[{b1,b2,b3},1]}];
cc=Join}]
18# wayne
第4行可以更简洁一点,
1 - Sign[(Range /. Thread[# -> 0]) & /@ Join]
ReplacePart, List /@ # -> 1] & /@ Join
Normal, 19] & /@ Join]
八维通解
本帖最后由 hujunhua 于 2013-4-17 10:03 编辑18#生成的矩阵轶=12,故参数解是8维的(总和也作为一个变量),一个优化的参数解如下(优化标准是旋转对称度和各表达式的简明性):
s+a+c O+b+C S+A+B
O+A+b B c O+a+C
S+B+C a O A s+b+c
O+A+c C b O+a+B
s+a+b O+B+c S+A+C
看起来有九个参数,但有约束 s+S=O,所以实际上是 8 参数解。
从2#的结果看,S=O,s=0,所以一个高度对称、简明的六参数解(总和给定)为
a+c O+b+C O+A+B
O+A+b B c O+a+C
O+B+C a O A b+c
O+A+c C b O+a+B
a+b O+B+c O+A+C
2#的数据中,1+10=2+9=3+8,这3个“等和对”处于旋转对称位置,15+7=16+6=18+4,这3个“等和对”处于旋转对称位置,这都不是偶然的,因在参数解中有完全体现。