找回密码
 欢迎注册
楼主: markfang2050

[原创] 六边形上19个黑点上不同数字求所有的解!

[复制链接]
发表于 2019-5-13 20:34:25 | 显示全部楼层
hujunhua 发表于 2019-5-13 13:35
4, 2, 6, 6, 4, 11, 5, 8, 0
我对于和为30的无解表示十分不解,也许存在一个简明的人肉证明。

我先说一说,手工分析所依据的一些导出等和组合及和为 “30” 基本资料。
为了表述方便,按下图左对各点分组编号:
1.JPG 2.JPG
记幻方数为m,组号表示组元之和,设A=2a。导出组合如下:
一、边心大三角组合:右图所示俩大三角形顶点之和相等。即
        E12+E34+E56=E23+E45+E61=E/2=95+5a-3m=5a+5
二、菱形组合:右图所示三色菱形顶点之和相等,即
         R1+E23+R4+E56=R2+E34+R5+E61=E12+R3+E45+R6=(R+E)/3=95-2m+a=35+a
三、小三角形组合:Ri+Rj-Eij=m-2A
四、径向双数组合:Ri+Vi=m-A

m=30的基本资料
一、由E=10+5A及E为偶数, E≥21可知
         E=30, 40, 50, 60, 70, 80, 90
         A=4, 6, 8, 10, 12, 14, 16
二、易证A=4, 6, 14, 16无解。
当A=4, 6时,径向双数组合Ri+Vi=26,24都恰有6解,剩余的数归入E组:
A                   4                                       6
Ri         7,   8,   9,  10, 11, 12       5,   7,    8,  9,   10, 11
+
Vi        19, 18, 17, 16, 15, 14       19, 17, 16, 15, 14,  13
E组      1,2,3,5,6,13         1,2,3,4,12,18
但这样的E组都显然分不成两个大三角组合(其中的最大数13,18太大)。
故A=4,6无解。
对应地,A=16,14  也无解。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-5-13 22:52:05 | 显示全部楼层
m=30, A=8时,R=67, V=65, E=50, 大三角组合E/2=25, 菱形组合(E+R)/3=39
径向双数组合 Ri+Vi=22 有7解
3+19
4+18
5+17
6+16
7+15
9+13
10+12
可确定的E组元素有1, 2, 11, 14,还有 2 个需从上面调配。
上述7解为4奇3偶,由于V、R为奇,所以必取3奇3偶,调给E组的必是一个奇数对。
E/2=25, 所以两个大三角组合必定一个是三奇,一个是一奇两偶,故必是
14+2+9=11+1+13=25
(待续)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-5-14 17:49:33 | 显示全部楼层
三、试证A=10无解。
        我们将19个数每个减去10,变成0, ±1, ±2, ±3, ±4, ±5, ±6, ±7, ±8, ±9.
        A=10变成了A=0,幻方数m=30变成了m=0. 19个数总和190也变成了总和0.
1、径向双数组合Ri+Vi=0有9解,恰好是全部9个相反数对(互补对)。
        Vi+Ri取6个相反对,其余三个归入E组。因此相反对不可能出现在V组、R组内部。
2、菱形组合的和也是0.
       菱形组合内的相对R元不是相反对→相对E元不是相反对。
3、大三角组合的和亦为0,即E21+E34+E56=E23+E45+E61=0。
        因此相反对不会出现在大三角组合E/2内部,否则第3角为零了。E组内的相反对在两个E/2间。
        由于相对E元非相反对,所以E组内的相反对相邻。
4、小三角组合变得简明:Eij=Ri+Rj,这个组合对奇偶运算很重要。

9个相反对分为奇数对5个,偶数对4个。
在大三角组合E/2内的三个数必是2奇1偶或者3偶,所以E组的3个相反对必是2奇1偶或者3偶,如下表所示(红色0,1)。
已知E组的三个相反对的奇偶分布,便可按小三角组合进行奇偶运算,推导出(Ri+Vi)各相反对的相对奇偶关系,如下表所示:
E组相反对为3偶
x 0 x
0 x x 0
x x O x x
0 x x 0
x
0
x
x=1 时6奇3偶
x=0 时0奇9偶
E组相反对为1偶2奇
x
1 y
0 x
y
1
x x O xx
0x y 1
x 1y
x=1, y=0 时6奇3偶
x=0, y=1 时4奇5偶

两种情况都得不到5奇4偶的结果,可见A=10无解。

点评

奇偶检验,用得不错。再接再厉,把45#的A=8续完。  发表于 2019-5-16 09:02

评分

参与人数 1威望 +6 金币 +20 贡献 +6 经验 +6 鲜花 +6 收起 理由
hujunhua + 6 + 20 + 6 + 6 + 6 奇偶检验,简明!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-5-16 09:28:54 | 显示全部楼层
hujunhua 发表于 2019-5-13 22:52
A=8时,径向双数组合Ri+Vi=22有7解
3+19
4+18


接45#(不知天高地厚,我就接了),欢迎批评指正!

大三角组合为14+2+9=11+1+13=25,
径向双数组合 Ri+Vi 为
3+19
4+18
5+17
6+16
7+15
10+12
上述左列6个数之和=35,与R=67相差32,与V=65相差30.
“右列-左列”依次是16, 14, 12, 10, 8, 2
从右边调30或者32到左边,即把上述差列分成和为30与32的两部分,计有3个组合
30=16+14=12+10+8=16+12+2,(对应的 32 组合略)
组合(1),  R=67=3+4+12+15+16+17, V=65=5+6+07+10+18+19
组合(2),  R=67=5+6+07+12+18+19, V=65=3+4+10+15+16+17
组合(3),  R=67=3+5+10+15+16+18, V=65=4+6+07+12+17+19
对组合(1), 穷举Eij=30-Vi-Vj,得不到E组中的9。
对组合(2), 穷举Eij=30-Vi-Vj,得不到E组中的1。
对组合(3), 穷举Eij=30-Vi-Vj,得不到E组中的2。

点评

穷举检漏,表述起来也简明,避免了按分枝树搜索检验。  发表于 2019-5-16 12:29

评分

参与人数 1威望 +6 金币 +20 贡献 +6 经验 +6 鲜花 +6 收起 理由
hujunhua + 6 + 20 + 6 + 6 + 6 穷举捡一漏,有总揽全局之高。

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-5-16 12:50:22 | 显示全部楼层
可以不穷举。
最后得到的V组都有一个特性,就是存在和等于30的三元子集,显然它必是{V1, V3, V5}或者{V2, V4, V6}。
问题是这样的三元子集还不止一个,两个又必有公共元,不妨设公共元占V1, 则非公共元都要占{V3, V5}, 这就撞车了。
以组合(1)的V=5+6+7+10+18+19为例,和为30的三元子集有以下两个:
30=5+6+19=5+7+18,公共元为5。{6, 19}与{7, 18}撞车。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-11-7 18:13:56 | 显示全部楼层
本帖最后由 chyanog 于 2019-11-7 19:11 编辑

magic hexagon.png
magic hexagon 22 23.png
求解和为20-100的所有解。Mathematica代码,考虑去重,耗时约0.3秒,设置CompilationTarget -> "C"耗时不到0.1秒
  1. A = {i1, i2, -i1 - i2 + s, i3, i1 + 2 i4 + Mod[s, 2],  3 i1 + i2 + 2 i4 - s + Mod[s, 2], i5, -i1 - i3 + s,   3 i1 + i3 + 2 i4 - s + Mod[s, 2], -2 i1 - 2 i4 + 2 Floor[s/2],  i1 - i2 + 2 i4 + i5 + Mod[s, 2], i1 + i2 - i5, i6,  i1 - i3 + 2 i4 + i6 + Mod[s, 2],  95 - 2 i1 - 3 i4 - i5 - i6 - 3 s + 3 Floor[s/2], 95 - 5 i1 - i2 - 5 i4 - i6 - 3 s + 5 Floor[s/2], i1 + i3 - i6,  95 - 5 i1 - i3 - 5 i4 - i5 - 3 s + 5 Floor[s/2], -95 + 4 i1 +  5 i4 + i5 + i6 + 4 s - 5 Floor[s/2]};
  2. F = Symbol["i" <> ToString[#]] &;
  3. cond = And @@Thread[1 <= Complement[A, {i1, i2, i3, i4, i5, i6}] <= 19] && Unequal @@ A // LogicalExpand;
  4. iter = Table[{F[i + 1], If[Select[cond, F[i] == Last@Sort[Cases[#, x_Symbol /; x =!= s, -1]] &],  Evaluate@If[i < 6, 19, 1], 0]}, {i, 6}];
  5. cf = Compile[{{i1, _Integer}, {s, _Integer}},
  6.      Module[{B = Internal`Bag[Rest@{0}]}, Do[Internal`StuffBag[B, #, 1], ##2]; Internal`BagPart[B, All]],
  7.      RuntimeAttributes -> {Listable}, RuntimeOptions -> "Speed"(*,CompilationTarget->"C"*)
  8.      ] &[A, Sequence @@ iter];
  9. func = Sort[Sort /@ Extract[#, List /@ {{1, 2, 3}, {3, 7, 12}, {12, 16, 19}, {19, 18, 17}, {17,13, 8}, {8, 4, 1}}]] &;
  10. search[s_] := DeleteDuplicatesBy[Join @@ (Partition[#, 19] & /@ cf[Range[19], s]), func];
  11. ans = Table[{s, search[s]}, {s, 20, 100}]; // AbsoluteTiming
复制代码

画图代码
  1. plot[A_List] :=
  2. With[{pts = Append[#, {0, 0}] & /@ Partition[CirclePoints[6], 2, 1, 1]},
  3.   Graphics[{
  4.     Line[pts], MapIndexed[{{EdgeForm[Black], LightBlue, Disk[#, 0.1]}, Style[Text[A[[Tr@#2]], #], 16]} &,
  5.      SortBy[Union @@ (Join[#, Mean /@ Partition[#, 2, 1]] & /@ pts), -N@Last@# &]]
  6.     }, ImageSize -> 300
  7.    ]]

  8. plot /@ search[22]
复制代码


C代码,没考虑去重,耗时约0.1秒
  1. #include <stdio.h>
  2. #include <time.h>

  3. #define C1 1+i1+i2>s||s>19+i1+i2||i1==i2||2*i1+i2==s||i1+2*i2==s

  4. #define C2 1+i1+i3>s||s>19+i1+i3||i1==i3||i2==i3||i2==i3||i1+i2+i3==s||i1+i2+i3==s||2*i1+i3==s||i1+2*i3==s

  5. #define C3 2*i1+i2+i4>19+s||2*i1+i3+i4>19+s||1+s>2*i1+i2+i4||1+s>2*i1+i3+i4||1+i1+i4>s||s>19+i1+i4||i1==i4||i2==i4||i2==i4||i3==i4||i3==i4||i1+i2+i4==s||i1+i2+i4==s||i1+i2+i4==s||i1+i3+i4==s||i1+i3+i4==s||i1+i3+i4==s||2*i1+i4==s||2*i1+i4==s||2*i1+i4==s||2*i1+i2+i4==i3+s||2*i1+i3+i4==i2+s||3*i1+i2+i3+i4==2*s||3*i1+i2+i3+i4==2*s||3*i1+2*i2+i4==2*s||3*i1+2*i3+i4==2*s||i1+2*i4==s||3*i1+i2+2*i4==2*s||3*i1+i3+2*i4==2*s||i2==i3||2*i1+i2==s||2*i1+i3==s

  6. #define C4 1+i2>i4+i5||i4+i5>19+i2||i1+i2>19+i5||1+i5>i1+i2||i1==i5||i1==i5||i2==i5||i2==i5||i2==i5||i3==i5||i4==i5||2*i1+i2+i4==i5+s||2*i1+i2+i4==i5+s||2*i1+i3+i4==i5+s||i1+i2+i5==s||i1+i3+i5==s||i1+i4+i5==s||i1+i4+i5==s||i1+i4+i5==s||2*i1+i2+i3==i5+s||2*i1+i2+i3==i5+s||i1+i2==i3+i5||i1+i3+i4+i5==i2+s||i1+i3+i4+i5==i2+s||i1+i2==i4+i5||i1+i2==i4+i5||i2+i3==i4+i5||2*(i1+i2)==i5+s||i5+s==2*(i1+i2)||i1+2*i4+i5==i2+s||2*i2==i4+i5||i1+i2==2*i5||i1+2*i2==i4+2*i5||i2==i4

  7. #define C5 1+i3>i4+i6||i4+i6>19+i3||i1+i3>19+i6||1+i6>i1+i3||i1==i6||i1==i6||i2==i6||i1+i2==i5+i6||i3==i6||i3==i6||i3==i6||i4==i6||2*i1+i2+i4==i6+s||2*i1+i3+i4==i6+s||2*i1+i3+i4==i6+s||i5==i6||i2+i6==i4+i5||i1+i2+i6==s||i1+i3+i6==s||i1+i4+i6==s||i1+i4+i6==s||i1+i4+i6==s||2*i1+i2+i3==i6+s||2*i1+i2+i3==i6+s||i2+i6==i3+i5||i2+i6==i3+i5||i1+i3==i5+i6||i1+i3==i2+i6||i1+i2+i4+i6==i3+s||i1+i2+i4+i6==i3+s||i1+i2+i3==i4+i5+i6||i1+i2+i3==i4+i5+i6||i2+i3==i4+i6||i1+i3==i4+i6||i1+i3==i4+i6||i3+i5==i4+i6||2*(i1+i3)==i6+s||i6+s==2*(i1+i3)||i1+2*i4+i6==i3+s||2*i3==i4+i6||i1+i3==2*i6||i1+2*i3==i4+2*i6||i3==i4

  8. #define C6 1+2*i1+i2+i4>i5+i7+s||1+2*i1+i3+i4>i6+i7+s||i5+i7+s>19+2*i1+i2+i4||i6+i7+s>19+2*i1+i3+i4||i1+i4>19+i7||1+i7>i1+i4||i1==i7||i1==i7||i2==i7||i1+i2==i5+i7||i1+i2==i5+i7||i1+i2==i5+i7||i3==i7||i1+i3==i6+i7||i1+i3==i6+i7||i1+i3==i6+i7||i4==i7||i4==i7||2*i1+i2+i4==i7+s||2*i1+i2+i4==i7+s||2*i1+i2+i4==i7+s||2*i1+i3+i4==i7+s||2*i1+i3+i4==i7+s||2*i1+i3+i4==i7+s||i5==i7||i6==i7||i2+i7==i4+i5||i2+i7==i4+i5||i1+i2+i7==s||i1+i2+i7==s||i3+i7==i4+i6||i3+i7==i4+i6||i1+i3+i7==s||i1+i3+i7==s||i1+i4+i7==s||2*(i1+i4)==i7+s||2*(i1+i4)==i7+s||i7+s==2*(i1+i4)||2*i1+i2+i3+i4==i5+i7+s||2*i1+i2+i3+i4==i6+i7+s||i1+i4==i2+i7||i1+i4==i3+i7||2*i1+i3+i4+i5==i6+i7+s||2*i1+i2+i4+i6==i5+i7+s||i1+i4==i5+i7||i1+i4==i5+i7||i1+i4==i6+i7||i1+i4==i6+i7||i1+i2+i4==i3+i5+i7||i1+i3+i4==i2+i6+i7||2*i1+2*i2+i4==i5+i7+s||2*i1+2*i3+i4==i6+i7+s||3*i1+i2+i4==i5+i7+s||3*i1+i3+i4==i6+i7+s||3*i1+i2+i3+i4==i5+i6+i7+s||3*i1+i2+i3+i4==i5+i6+i7+s||2*i1+i2+2*i4==i5+i7+s||2*i1+i3+2*i4==i6+i7+s||2*i1+i3+2*i4+i5==i2+i6+i7+s||2*i1+i2+2*i4+i6==i3+i5+i7+s||4*i1+i2+i3+2*i4==i5+i7+2*s||4*i1+i2+i3+2*i4==i6+i7+2*s||i5+i7+2*s==2*(2*i1+i2+i4)||i6+i7+2*s==2*(2*i1+i3+i4)||3*i1+2*i2+i4==2*i5+i7+s||3*i1+2*i3+i4==2*i6+i7+s||3*i1+i2+2*i4==i5+2*i7+s||3*i1+i3+2*i4==i6+2*i7+s||i1+i4==2*i7||2*i1+i2+i4==i5+s||2*i1+i3+i4==i6+s||i2+i6==i3+i5

  9. int main()
  10. {
  11.         clock_t t0 = clock();
  12.         int i1, i2, i3, i4, i5, i6, i7, s;
  13.         for (s = 20; s <= 40; s++){
  14.                 int cnt = 0;
  15.                 for (i1 = 1; i1 <= 19; i1++){
  16.                         for (i2 = 1; i2 <= 19; i2++){
  17.                                 if (C1) continue;
  18.                                 for (i3 = 1; i3 <= 19; i3++){
  19.                                         if (C2) continue;
  20.                                         for (i4 = 1; i4 <= 19; i4++){
  21.                                                 if (C3) continue;
  22.                                                 for (i5 = 1; i5 <= 19; i5++){
  23.                                                         if (C4) continue;
  24.                                                         for (i6 = 1; i6 <= 19; i6++){
  25.                                                                 if (C5) continue;
  26.                                                                 for (int i7 = 1; i7 <= 19; i7++){
  27.                                                                         if (C6) continue;
  28.                                                                         cnt++;
  29.                                                                         //printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", i1, i2, -i1 - i2 + s, i3, i4, 2 * i1 + i2 + i4 - s, i5, -i1 - i3 + s, 2 * i1 + i3 + i4 - s,-i1 - i4 + s, -i2 + i4 + i5, i1 + i2 - i5, i6, -i3 + i4 + i6, i7,-2 * i1 - i2 - i4 + i5 + i7 + s, i1 + i3 - i6, -2 * i1 - i3 - i4 + i6 + i7 + s, i1 + i4 - i7);
  30.                                                                 }
  31.                                                         }
  32.                                                 }
  33.                                         }
  34.                                 }
  35.                         }
  36.                 }
  37.                 printf("%d, %d\n", s, cnt);
  38.         }
  39.         printf("Elapsed time %0.4f\n", (clock() - t0) / 1000.0);
  40.         return 0;
  41. }
复制代码

20191107182945.png
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-6 11:03 , Processed in 0.061707 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表