- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 40157
- 在线时间
- 小时
|
楼主 |
发表于 2022-11-27 16:54:39
|
显示全部楼层
现在对于11棵树每个圆4棵的情况有了比较好的分析代码了,
运行这个程序之前,需要安装pari/gp和Singular两个软件进行符号运算。
代码中假设gp在默认运行路径,Singular运行路径被硬编码,需要根据自己实际运行环境进行修改。
代码中会调用两个gp文件,路径也被我的代码硬编码,可能需要修改。(这两个gp文件会用于判断多项式是否存在实数解)
https://github.com/emathgroup/se ... ched/files/sd11.tgz
首先主程序为
scfg.cpp,
运行时,需要在当前目录下先创建目录sd, scfg.cpp会将运行的结果产生到这个目录下。
比较有意思的是文件开头有个宏
#define FM "0"
可以将0改为其它素数(小于2^24,但是不能太小,比如32003,如果选择太小的素数,结果可能会不正确),会提高运行速度。
这个程序的运行结果在sd目录下产生了277组候选解。
比如f527519就是其中一种被保留的配置,是一个Singular代码软件,用Singular运行它,产生f527519.out
代码scfg.cpp中数组cfg[NUMCFG]给出了所有用10棵树种12行,每行3棵树的合法配置。
其中第一个成员name是由ABCD...等字母构成的序列,每三个字母代表一行树。
然后下面一行如果是RINGP("1-t-t2"),就代表运算在满足$1-t-t^2=0$的参数t扩张的域中进行计算。如果是RINGt就是在普通有理数域加一个变参t等。
再下面给出10个点的坐标,然后可选项给出了额外的对参数的一些已知淘汰条件,比如
{
"ABEAFGAHIBFHBGJCDECFICHJDFJDGIEGHEIJ",
RINGt
"list n1=0,0,1;\n"//A, J_X=t,D_X=1+t-t2
"list n2=0,1,1;\n"//B
"list n3=1+t-t2,t2,1;\n"//C
"list n4=1+t-t2,-t,1;\n"//D
"list n5=0,1,0;\n"//E
"list n6=1,0,1;\n"//F
"list n7=1,0,0;\n"//G
"list n8=1,-1,0;\n"//H
"list n9=t,-t,1;\n"//I
"list n10=t,1,1;\n",//J
"j=t;\ni=sat(si,j)[1];\nsi=std(i);\n"
"j=t+1;\ni=sat(si,j)[1];\nsi=std(i);\n"
"j=t-1;\ni=sat(si,j)[1];\nsi=std(i);\n"
},
代表有直线ABE, AFG, AHI, BFH等。其中有一个自由参数t, A点的射影坐标为(0:0:1)就是平面坐标中圆点。E点(0:1:0)是y轴方向无穷远点等。
最后给出三个条件j=t代表t不能等于0,j=t+1代表t不能等于-1等(因为这些条件都会导致n1到n10中部分点重叠).
代码的搜索方案是如果存在一个11棵树每四棵一个圆的较多圆的方案,以其中一棵树为反演中心做反演变换,把所有经过这棵树的圆反演为过三点的直线。而不经过这颗树的圆变成经过余下10点中四个点的圆。然后再对图像进行射影变换,必然能够变成cfg[..]中一种方案,但是这时那些余下圆都被变换成经过两个共轭公共虚交点的圆锥曲线,假设这两个公共虚交点为(a+bi,c+di), (a-bi,c-di)。
对于树较多的方案,除了上面第一个点,还会有第二个点同样有很多圆经过,那么所有经过第二个点的圆如果以这个点为反演中心进行变换后也会变成cfg[..]中一种,所以代码里面会搜索至少有两个点经过的圆的数目等于12时的方案。
搜索过程固定第一棵树为反演后的无穷远点。然后对于穷举第二个点为其余的10个点并且余下其它所有树的任意排列方案以及第二棵树为反演中心后得到的直线模式是cfg[..]中任何一种方案,我们就可以得出很多额外圆被投影以后的方程,其中含额外变量a,b,c,d.
需要注意这些方程中,我们要求解的变量a,b,c,d以及t等都必须是实数。然后将这些方程提交给Singular进行化简。如果判断出无解就淘汰,不然保存在文件中,如f527519.out
Singular代码在做完方程化简以后,还顺便判断了一下是否可以在不增加任何额外约束的前提下增加更多的圆,这个使用singular中reduce函数,也就是如果reduce(g,i)=0, (其中g是多项式,i是一个方程组)那么代表g=0对于方程组i是永远成立的。singular代码会将这些额外圆的顺便输出为[x,y,z,w],其中x,y,z,w为四个点的编号。
如附件中的f527519.out
{6, 7, 8, 10}
{6, 7, 9, 10}
[6,8,9,10]
{7, 8, 9, 10}
known 23, upbound 222
其中[6,8,9,10]代表这种配置中6,8,9,10这四点总是共圆(经过第一个点的直线不会被输出),known 23表示这种方案至少23个圆。
原先代码还试着计算是否可以有某些圆被添加使得方程组还是继续有解,比如{6,7,8,10}就代表这四个点圆可以增加后,方程组还可能有解(但是不一定实数解), 这样我们可以给出总的圆数目的上界,这里是222,但是这个判断显然不够有效,这部分代码被我删除了,在现在的scfg.cpp里面看不到。
后来发现上界判断不够有效的主要原因是方程组化并且添加新的圆的方程后,一些额外的过滤条件并没有被使用,为此,我有增加了代码
scfg2.cpp,
它会更具scfg.cpp输出到sd目录中的配置,对这些配置做重复计算(这时需要保持FM 为"0",以便在实数域进行计算,可以用gp淘汰一些没有实数解的方程)。
重复计算:
对上面额外四点共圆方程添加以后,在同样适用一些过滤条件,排除一些非法的三点共线情况,得出圆的数目的上界。
比如这时sdo/f527519.out倒数第二行结果变成了,known 23, max 23。也就是说这种配置方案有且只能有23个圆。
但是我们知道有些方程组虽然有解,但是只包含非实数解,为此添加代码filt3.cpp,
它会调用pari/gp代码对fdo中每个结果进行检查,尽量排除一些没有实数解的情况。
其输出结果在filt3.out,比如前几行为
pass f529485, m=10,n=10, known 23, max 23
pass f516489, m=9,n=11, known 30, max 69
filter f527922
pass f307969, m=4,n=4, known 32, max 32
filter f4690
表示f527922,f4690因为只有非实数解被淘汰。
另外它还给每一个解已知圆的点圆关系输出到文件result.all (运行前确保先清空这个文件),每四个字母一个圆。运行结果还有131个结果。
另外代码norm4.cpp可用用来将每个点圆关系进行标准化,运行后结果放在result.alln,排序并且淘汰重复的余下18种在result.alls
filt3.out中大部分结果known和max相同,代表所有的圆已经找出。
我们需要关注的是max>known的以及known==max>=30时的所有解。再根据等价关系,余下需要分析的解已经不多了。
另外比如
pass f307969, m=4,n=4, known 32, max 32
我们发现判断出32个圆,打开f307969.out发现
[1,2,3,7]
[1,2,3,9]
[1,2,6,8]
[1,2,7,9]
[1,3,4,8]
[1,3,7,9]
..
说明存在5点共圆1,2,3,7,9被计算5次,所以实际上最多不超过28个圆。
而
f446313同样有5点共圆
[1,2,3,4]
[1,2,3,8]
[1,2,4,8]
...
f482153同样有五点共圆
[1,2,3,8]
[1,2,3,10]
由此所有三类不同的known 32, max32的情况都有5点共圆的情况,实际上圆的数目不超过28.
而known 31, max 31的情况只有一种,对应文件f170648.out
其中也找到了5点共圆情况:
[2,5,6,7]
[2,5,6,10]
[2,5,7,10]
[2,6,7,10]
而known=30的只有四种不同的情况,分别为
pass f406648, m=6,n=6, known 30, max 30
pass f409338, m=6,n=6, known 30, max 30
pass f516489, m=9,n=11, known 30, max 69
pass f305404, m=4,n=4, known 30, max 30
我们还需要关注的有max>known的情况,实际上这个文件里面只有known 30,max 69这一种。
f516489.out:
succ 30
si[1]=c-t
si[2]=2adt+2bt2-2bt-4dt+d
si[3]=2a2t+2b2t-a2-b2-2bd-6at+2a+4t-1
si[4]=2b2dt-2abt2-a2d-b2d-2bd2+2abt+2bt2+ad-2bt
si[5]=2a3d+2ab2d+4abd2+4abt2-a2b-b3-4a2d-2b2d-4bd2-2abt-4bt2+2ab+2ad+2bt-b
[1,2,3,4]
{1, 2, 6, 8}
{1, 2, 6, 9}
{1, 2, 6, 10}
我们可以试着用singular打开文件f516489,然后添加圆1,2,6,8
> l0=1,2,6,8;
> h0=inonecv(allnodes,l0);
> i2=si,h0;
> si2=std(i2);
> si2;
> primdecGTZ(si2);
来得到一个解看看情况。后面这部分还需要进一步分析。有可能这部分还需要进行解的合法性和实数解分析。
而程序scfg3.cpp采用另外一个角度,再已经得到至少两个点都有12个圆经过的解的情况下,分析第三个经过有12个圆经过的点,发现不存在,从而证明了不存在超过30个圆点方案。而同样方法可以证明13棵树不存在46个以上的圆。
|
|