hujunhua 发表于 2013-4-16 17:16:16

    2   4   6
7   1   5   3
9   8   0   8   9
3   5   1   7
    6 4   2

chyanog 发表于 2013-4-16 18:20:50

7# hujunhua

k解出来了,k==38

chyanog 发表于 2013-4-16 19:20:14

用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;
}

wayne 发表于 2013-4-16 20:51:20

本质上就是 一个 16*19的常数矩阵C,乘以19*1的列向量X,得到一个16*1的列向量A=k*{1,1,1,1,1,....,1,5}
其中,5k=19*20/2------------------------------>也即是   k=38

wayne 发表于 2013-4-16 22:26:41

5# hujunhua
Binomial=27132 ,
也就是说总共只需要循环27132 次,每一次解13*13的线性方程,这个规模其实很小,基本上不费时间的。
老大说的超过“机器数”是啥意思?

chyanog 发表于 2013-4-16 22:35:07

15# wayne
我觉得是可能是生成的list太大,Mathematica报内存溢出了

wayne 发表于 2013-4-16 22:43:53

5# hujunhua
(x1,x2,x3,x4,x5,x6),(i=7~19)取自6个无约束关系的格。
这6个格子代表6个自由度,选择这样的格子还是比较难的。

该不会是2,4,13,18,16,7 吧

wayne 发表于 2013-4-16 23:00:11

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}]

chyanog 发表于 2013-4-17 00:18:48

18# wayne
第4行可以更简洁一点,
1 - Sign[(Range /. Thread[# -> 0]) & /@ Join]
ReplacePart, List /@ # -> 1] & /@ Join
Normal, 19] & /@ Join]

hujunhua 发表于 2013-4-17 02:16:31

八维通解

本帖最后由 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个“等和对”处于旋转对称位置,这都不是偶然的,因在参数解中有完全体现。
页: 1 [2] 3 4
查看完整版本: 六边形幻方