王守恩
发表于 2019-5-13 20:34:25
hujunhua 发表于 2019-5-13 13:35
4, 2, 6, 6, 4, 11, 5, 8, 0
我对于和为30的无解表示十分不解,也许存在一个简明的人肉证明。
我先说一说,手工分析所依据的一些导出等和组合及和为 “30” 基本资料。
为了表述方便,按下图左对各点分组编号:
记幻方数为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也无解。
hujunhua
发表于 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无解。
王守恩
发表于 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。
hujunhua
发表于 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}撞车。
chyanog
发表于 2019-11-7 18:13:56
本帖最后由 chyanog 于 2019-11-7 19:11 编辑
求解和为20-100的所有解。Mathematica代码,考虑去重,耗时约0.3秒,设置CompilationTarget -> "C"耗时不到0.1秒
A = {i1, i2, -i1 - i2 + s, i3, i1 + 2 i4 + Mod,3 i1 + i2 + 2 i4 - s + Mod, i5, -i1 - i3 + s, 3 i1 + i3 + 2 i4 - s + Mod, -2 i1 - 2 i4 + 2 Floor,i1 - i2 + 2 i4 + i5 + Mod, i1 + i2 - i5, i6,i1 - i3 + 2 i4 + i6 + Mod,95 - 2 i1 - 3 i4 - i5 - i6 - 3 s + 3 Floor, 95 - 5 i1 - i2 - 5 i4 - i6 - 3 s + 5 Floor, i1 + i3 - i6,95 - 5 i1 - i3 - 5 i4 - i5 - 3 s + 5 Floor, -95 + 4 i1 +5 i4 + i5 + i6 + 4 s - 5 Floor};
F = Symbol["i" <> ToString[#]] &;
cond = And @@Thread <= 19] && Unequal @@ A // LogicalExpand;
iter = Table[{F, If == Last@Sort] &],Evaluate@If, 0]}, {i, 6}];
cf = Compile[{{i1, _Integer}, {s, _Integer}},
Module[{B = Internal`Bag}, Do, ##2]; Internal`BagPart],
RuntimeAttributes -> {Listable}, RuntimeOptions -> "Speed"(*,CompilationTarget->"C"*)
] &;
func = Sort] &;
search := DeleteDuplicatesBy & /@ cf, s]), func];
ans = Table[{s, search}, {s, 20, 100}]; // AbsoluteTiming
画图代码
plot :=
With[{pts = Append[#, {0, 0}] & /@ Partition, 2, 1, 1]},
Graphics[{
Line, MapIndexed[{{EdgeForm, LightBlue, Disk[#, 0.1]}, Style], #], 16]} &,
SortBy] & /@ pts), -N@Last@# &]]
}, ImageSize -> 300
]]
plot /@ search
C代码,没考虑去重,耗时约0.1秒
#include <stdio.h>
#include <time.h>
#define C1 1+i1+i2>s||s>19+i1+i2||i1==i2||2*i1+i2==s||i1+2*i2==s
#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
#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
#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
#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
#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
int main()
{
clock_t t0 = clock();
int i1, i2, i3, i4, i5, i6, i7, s;
for (s = 20; s <= 40; s++){
int cnt = 0;
for (i1 = 1; i1 <= 19; i1++){
for (i2 = 1; i2 <= 19; i2++){
if (C1) continue;
for (i3 = 1; i3 <= 19; i3++){
if (C2) continue;
for (i4 = 1; i4 <= 19; i4++){
if (C3) continue;
for (i5 = 1; i5 <= 19; i5++){
if (C4) continue;
for (i6 = 1; i6 <= 19; i6++){
if (C5) continue;
for (int i7 = 1; i7 <= 19; i7++){
if (C6) continue;
cnt++;
//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);
}
}
}
}
}
}
}
printf("%d, %d\n", s, cnt);
}
printf("Elapsed time %0.4f\n", (clock() - t0) / 1000.0);
return 0;
}