mathe 发表于 2019-12-16 11:01:10

应该是指,总共有36个位置,分别可以用$a_{i,j}$表示,其中$0\le i\lt 6, 0\le j\lt 6$.
现在要求将$0~17,19~36$填入这36个位置,使得
$R_i=\sum_{j=0}^5 a_{i,j}=18\times 6$
$C_j=\sum_{i=0}^5 a_{i,j}=18\times 6$
$D_k=\sum_{i=0}^5 a_{i, (i+k)(\mod 6)}=18\times 6$

mathe 发表于 2019-12-16 11:15:02

原来还定义了三个对角线方向,每个方向6条,所以还需要添加额外3*6-3个关系式。
也就是36个变量,6*6-5=31个约束,只余下5个自由变量了。
先解方程得到31个非自由变量的表达式,然后依次试验5个自由变量的取值组合,判断余下的31个导出变量是否还在范围之内。
而对角线可以使用如下坐标定义
$H_{2,j}=\sum_{i=0}^5 a_{i,(2i+j)(\mod 6)}=18\times6$
$H_{5,j}=\sum_{i=0}^5 a_{i,(j-i)(\mod 6)}=18\times6$
$H_{4,j}=\sum_{i=0}^5 a_{(2i+j)(\mod 6),i}=18\times6$
由于约束条件太多了,存在解的可能性很小

mathe 发表于 2019-12-16 18:49:54

(%i4)        linsolve([+v0+v1+v2+v3+v4+v5=108,+v0+v6+v12+v18+v24+v30=108,+v0+v7+v14+v21+v28+v35=108,+v0+v8+v16+v18+v26+v34=108,+v0+v11+v16+v21+v26+v31=108,+v0+v13+v26+v3+v16+v29=108,+v6+v7+v8+v9+v10+v11=108,+v1+v7+v13+v19+v25+v31=108,+v1+v8+v15+v22+v29+v30=108,+v1+v9+v17+v19+v27+v35=108,+v1+v6+v17+v22+v27+v32=108,+v6+v19+v32+v9+v22+v35=108,+v12+v13+v14+v15+v16+v17=108,+v2+v8+v14+v20+v26+v32=108,+v2+v9+v16+v23+v24+v31=108,+v2+v10+v12+v20+v28+v30=108,+v2+v7+v12+v23+v28+v33=108,+v12+v25+v2+v15+v28+v5=108,+v18+v19+v20+v21+v22+v23=108,+v3+v9+v15+v21+v27+v33=108,+v3+v10+v17+v18+v25+v32=108,+v3+v11+v13+v21+v29+v31=108,+v3+v8+v13+v18+v29+v34=108,+v18+v31+v8+v21+v34+v11=108,+v24+v25+v26+v27+v28+v29=108,+v4+v10+v16+v22+v28+v34=108,+v4+v11+v12+v19+v26+v33=108,+v4+v6+v14+v22+v24+v32=108,+v4+v9+v14+v19+v24+v35=108,+v24+v1+v14+v27+v4+v17=108,+v30+v31+v32+v33+v34+v35=108,+v5+v11+v17+v23+v29+v35=108,+v5+v6+v13+v20+v27+v34=108,+v5+v7+v15+v23+v25+v33=108,+v5+v10+v15+v20+v25+v30=108,+v30+v7+v20+v33+v10+v23=108],[v0,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16
                ,v17,v18,v19,v20,v21,v22,v23,v24,v25,v26,v27,v28,v29,v30,v31,v32,v33,v34,v35]);
       
solve: dependent equations eliminated: (34 35 28 11 31 32 5 6 2 13 27 21)

(%o4)       
好像还有12个自由变量

mathe 发表于 2019-12-16 21:36:40

应该无解,代码效率不是很高,但是还是可以穷举完毕
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;

double v0,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18;
double v19,v20,v21,v22,v23,v24,v25,v26,v27,v28,v29,v30,v31,v32,v33,v34,v35;
double r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13;

void setv()
{
v0=-r9+r8-r7+r6+r4-2*r3+2*r13+r12-r11+r10-18;
v1=(r9-r8+2*r7-2*r6-r5-r4+r3+r2-2*r13-r12-r10+108)/2;
v2=r5;
v3=-r9-2*r7+r6-r5-r4-r3-r2+r13-r11+126;
v4=r8;
v5=(3*r9-3*r8+4*r7-2*r6+r5+r4+5*r3+r2-4*r13-r12+4*r11-r10-108)/2;
v6=-r4-r13-r10+72;
v7=r3;
v8=r11;
v9=r4;
v10=r7;
v11=-r7-r3+r13-r11+r10+36;
v12=-r9-r5+54;
v13=-(-r9-r8-r5-r4+r3+r2-2*r13+r12-r10+36)/2;
v14=-r8-r13+54;
v15=-(r9-3*r8+2*r7-2*r6+r5+r4+3*r3+r2-4*r13-r12+4*r11-r10-72)/2;
v16=(3*r9-3*r8+4*r7-4*r6+r5-r4+5*r3+3*r2-6*r13-r12+4*r11-r10-36)/2;
v17=-(r9-r8+2*r7-2*r6-r5-r4+r3+r2-2*r13-r12+r10)/2;
v18=2*r9-r8+2*r7-r6+r5+2*r3+r2-2*r13-r12+r11-54;
v19=r12;
v20=r2;
v21=r7-r6+r3-r13+r11-r10+18;
v22=-(r9+r8+2*r7-2*r6-r5-r4+r3+r2-2*r13+r12-r10-36)/2;
v23=-(3*r9-3*r8+4*r7-2*r6+3*r5+r4+5*r3+3*r2-4*r13-r12+4*r11-r10-252)/2;
v24=r13;
v25=-r9-r7-r3+72;
v26=-(r9-r8+2*r7-2*r6+r5+r4+r3+3*r2-2*r13+r12+2*r11+r10-180)/2;
v27=r10;
v28=r9;
v29=(r9-r8+4*r7-2*r6+r5+r4+3*r3+3*r2-4*r13+r12+2*r11-r10-108)/2;
v30=-r7-r2+54;
v31=r6;
v32=(r9+r8+2*r7-2*r6-r5+r4+r3+r2+r12+r10-72)/2;
v33=(3*r9-3*r8+4*r7-2*r6+3*r5+r4+3*r3+3*r2-4*r13-r12+4*r11-r10-144)/2;
v34=-2*r9+r8-2*r7+r6-r5-2*r3-r2+2*r13+r12-2*r11+108;
v35=-r4-r12+54;
}

int used;
#define R(x)r##x=a;
#define V(x)if(fabs(round(v##x)-v##x)>0.1)continue;\
            c=(int)round(v##x);if(c<0||c>=36)continue;\
            if(used)continue;\
            used=1;

#define P(x)printf("v%d=%d\n",x,(int)round(v##x));
void output()
{
    printf("Find one:\n");
    P(0)P(1)P(2)P(3)P(4)P(5)P(6)P(7)P(8)P(9)P(10)P(11)P(12)
    P(13)P(14)P(15)P(16)P(17)P(18)P(19)P(20)P(21)P(22)P(23)P(24)
    P(25)P(26)P(27)P(28)P(29)P(30)P(31)P(32)P(33)P(34)P(35)
}

int main()
{
    int a;
    int i,c;
    for(i=0;i<12;i++)a=i;
    do{
      for(i=0;i<36;i++)used=0;used=1;
      R(2)R(3)R(4)R(5)R(6)R(7)R(8)R(9)R(10)R(11)R(12)R(13)
      setv();
      V(0)V(1)V(2)V(3)V(4)V(5)V(6)V(7)V(8)V(9)V(10)V(11)V(12)
      V(13)V(14)V(15)V(16)V(17)V(18)V(19)V(20)V(21)V(22)V(23)V(24)
      V(25)V(26)V(27)V(28)V(29)V(30)V(31)V(32)V(33)V(34)V(35)
      output();
    }while(next_permutation(a,a+12));
}

mathe 发表于 2019-12-17 16:32:20

上面的代码错了,因为其中对参数r2,r3,....,r13代码中只让它们选择0~11之间的值了。
重新修改并运行代码,花费了将近4小时才结束,还是没有找到合法的解。
另外发现我说的方法hujunhua在5#就已经使用了。

hujunhua 发表于 2019-12-19 17:29:19

chyanog 发表于 2019-12-15 17:15
这句话怎么理解?

由于没有构造出6阶模幻方的实例,谨以一个7阶模幻方的实例来加以说明。

如图所示为一个7阶模幻方,其中填入了0, 1, 2, ..., 48(用二位七进数00, 01, ..., 66表示)。
取任意一个7X7的菱形视野,均正好包含0~48 。菱形可拉正为正方形,以合其名称中的“方”字。
为了表现其旋转对称性,我们取了一个正六方形视野,将其中49个数涂红。
三条黑实线方向为密排方向,三条橙色虚线方向为次密排方向。
在任一方向的直线上的格位以最小正周期7重复,视为同一格。
即任一方向的一条直线实际上只有7个数。
这个7阶幻方的约束是:
1、任意的连续7个密排数之和为7X24.
2、任意的连续7个次密排数之和为7X24.

这样定义的7阶模幻方的导出律是:
1、密排方向的任意正六边形,六角加中心数之和为7X24.
2、次密排方向的任意正六边形,六角加中心数之和为7X24.

hujunhua 发表于 2019-12-25 14:10:50

一个数据松散的6阶模幻方实例

既然用±{1, 2, ..., 18}也填不成,那咱把填入的数组再放松一些,好歹填一个出来再说。
以下是一个松散的实例,36个数总和为零,负向最大数为-109,正的最大数为110,宽度219. 数组也不是正负对称的。
图中红色为负数,excel自动变色的。

可以用此图验证前述各导出律。
这是我取-24至24间的12个随机整数做自由变量,1000次试验所得到的最小宽度。
肯定可以更紧凑啦。

hujunhua 发表于 2019-12-26 11:29:28

改进程序(加循环)后重试10万多次,运气还不错,猫到一个-42~40的。

mathe 发表于 2019-12-26 16:35:00

7阶的解好像很多很多,hujunhua帮忙验证一下,我的理解是否正确的,比如:
Find:
      a_(0,0)=6               a_(0,1)=25            a_(0,2)=7               a_(0,3)=30            a_(0,4)=47            a_(0,5)=15            a_(0,6)=38
      a_(1,0)=12            a_(1,1)=29            a_(1,2)=45            a_(1,3)=20            a_(1,4)=39            a_(1,5)=0               a_(1,6)=23
      a_(2,0)=46            a_(2,1)=14            a_(2,2)=37            a_(2,3)=5               a_(2,4)=22            a_(2,5)=10            a_(2,6)=34
      a_(3,0)=36            a_(3,1)=3               a_(3,2)=27            a_(3,3)=11            a_(3,4)=28            a_(3,5)=44            a_(3,6)=19
      a_(4,0)=21            a_(4,1)=9               a_(4,2)=33            a_(4,3)=43            a_(4,4)=17            a_(4,5)=41            a_(4,6)=4
      a_(5,0)=31            a_(5,1)=48            a_(5,2)=18            a_(5,3)=35            a_(5,4)=2               a_(5,5)=26            a_(5,6)=8
      a_(6,0)=16            a_(6,1)=40            a_(6,2)=1               a_(6,3)=24            a_(6,4)=13            a_(6,5)=32            a_(6,6)=42
Find:
      a_(0,0)=6               a_(0,1)=25            a_(0,2)=7               a_(0,3)=30            a_(0,4)=40            a_(0,5)=15            a_(0,6)=45
      a_(1,0)=12            a_(1,1)=29            a_(1,2)=38            a_(1,3)=20            a_(1,4)=46            a_(1,5)=0               a_(1,6)=23
      a_(2,0)=39            a_(2,1)=14            a_(2,2)=44            a_(2,3)=5               a_(2,4)=22            a_(2,5)=10            a_(2,6)=34
      a_(3,0)=43            a_(3,1)=3               a_(3,2)=27            a_(3,3)=11            a_(3,4)=28            a_(3,5)=37            a_(3,6)=19
      a_(4,0)=21            a_(4,1)=9               a_(4,2)=33            a_(4,3)=36            a_(4,4)=17            a_(4,5)=48            a_(4,6)=4
      a_(5,0)=31            a_(5,1)=41            a_(5,2)=18            a_(5,3)=42            a_(5,4)=2               a_(5,5)=26            a_(5,6)=8
      a_(6,0)=16            a_(6,1)=47            a_(6,2)=1               a_(6,3)=24            a_(6,4)=13            a_(6,5)=32            a_(6,6)=35

mathe 发表于 2019-12-26 16:38:14

6阶放大范围到45:
            a_(0,0)=8                a_(0,1)=24            a_(0,2)=25            a_(0,3)=40            a_(0,4)=15            a_(0,5)=26
            a_(1,0)=14            a_(1,1)=31            a_(1,2)=21            a_(1,3)=23            a_(1,4)=19            a_(1,5)=30
            a_(2,0)=44            a_(2,1)=17            a_(2,2)=38            a_(2,3)=1               a_(2,4)=32            a_(2,5)=4
            a_(3,0)=11            a_(3,1)=18            a_(3,2)=5               a_(3,3)=33            a_(3,4)=35            a_(3,5)=36
            a_(4,0)=16            a_(4,1)=42            a_(4,2)=29            a_(4,3)=39            a_(4,4)=0               a_(4,5)=12
            a_(5,0)=45            a_(5,1)=6                a_(5,2)=20            a_(5,3)=2               a_(5,4)=37            a_(5,5)=28
页: 1 [2] 3 4 5 6
查看完整版本: 6 阶模幻方的搜索