原文

挑战(二)是一个数学问题,但原文中缺乏严谨的数学解释;而且yuzan1830本来的问题是射线经过了哪些点,而不是多少点。因此这里补充两方面的内容:

  1. 邻接距离(邻接向量)的证明。
  2. 如何将坐标(x,y)(x,y)(x,y)转化为NaN_aNa​的形式。

正四边形

首先是第n0n_0n0​层的第aaa个点的坐标Na(x,y)N_a(x,y)Na​(x,y):

(x,y)={(a−1,n0−a+1)0<a⩽n0(2n0−a+1,n0−a+1)n0<a⩽2n0(2n0−a+1,−3n0+a−1)2n0<a⩽3n0(−4n0+a−1,−3n0+a−1)3n0<a⩽4n0(x,y)=\begin{cases} (a-1,n_0-a+1)&0<a\leqslant n_0\\ (2n_0-a+1,n_0-a+1)&n_0<a\leqslant 2n_0\\ (2n_0-a+1,-3n_0+a-1)&2n_0<a\leqslant 3n_0\\ (-4n_0+a-1,-3n_0+a-1)&3n_0<a\leqslant 4n_0 \end{cases}(x,y)=⎩⎪⎪⎪⎨⎪⎪⎪⎧​(a−1,n0​−a+1)(2n0​−a+1,n0​−a+1)(2n0​−a+1,−3n0​+a−1)(−4n0​+a−1,−3n0​+a−1)​0<a⩽n0​n0​<a⩽2n0​2n0​<a⩽3n0​3n0​<a⩽4n0​​

坐标的得出还是比较直观的,原文如下,这里不再解释。

考虑yyy轴正半轴与第一象限组成的区域,通过观察不难发现这个区域中第n0n_0n0​层的点包括N1,N2,…,Nn0N_1,N_2,\dots,N_{n_0}N1​,N2​,…,Nn0​​,且横坐标顺时针递增。 同理,xxx轴正半轴与第四象限组成的区域中的点包括Nn0+1,Nn0+2,⋯,N2n0N_{n_0+1},N_{n_0+2},\cdots,N_{2n_0}Nn0​+1​,Nn0​+2​,⋯,N2n0​​,且横坐标顺时针递减。 yyy轴负半轴与第三象限组成的区域中的点包括N2n0+1,N2n0+2,⋯,N3n0N_{2n_0+1},N_{2n_0+2},\cdots,N_{3n_0}N2n0​+1​,N2n0​+2​,⋯,N3n0​​,且横坐标顺时针递减。 xxx轴负半轴与第二象限组成的区域中的点包括N3n0+1,N3n0+2,⋯,N4n0N_{3n_0+1},N_{3n_0+2},\cdots,N_{4n_0}N3n0​+1​,N3n0​+2​,⋯,N4n0​​,且横坐标顺时针递增。

容易发现∣x∣+∣y∣=n0\vert x\vert+\vert y\vert=n_0∣x∣+∣y∣=n0​,即点NaN_aNa​在以原点为中心、半对角线长为n0n_0n0​的倾斜正方形上。又因为aaa的取值是连续整数,x,yx,yx,y中aaa的系数的绝对值为111,所以x,yx,yx,y的取值也是连续的整数,图中的点一定是满足∣x∣+∣y∣⩽n\vert x\vert+\vert y\vert\leqslant n∣x∣+∣y∣⩽n的所有整点。

对于图中两点N(x1,y1),M(x2,y2)N(x_1,y_1),M(x_2,y_2)N(x1​,y1​),M(x2​,y2​),记NM→=(x2−x1,y2−y1)=r⃗\overrightarrow{NM}=(x_2-x_1,y_2-y_1)=\vec rNM=(x2​−x1​,y2​−y1​)=r,邻接向量为d⃗\vec dd。原文给出的结论是

d⃗=r⃗gcd⁡(Δx,Δy)=r⃗gcd⁡(x2−x1,y2−y1)\vec d=\dfrac{\vec r}{\gcd(\Delta x,\Delta y)}=\dfrac{\vec r}{\gcd(x_2-x_1,y_2-y_1)}d=gcd(Δx,Δy)r​=gcd(x2​−x1​,y2​−y1​)r​

下面给出证明。记点NNN加上kkk个d⃗\vec dd后得到的点(x1+kxd⃗,y1+kyd⃗)(x_1+kx_{\vec d},y_1+ky_{\vec d})(x1​+kxd​,y1​+kyd​)为点NkN^kNk。只需证明两件事实:

事实1: 若NkN^kNk是图中的点,则kkk一定属于一段连续区间,且kkk一定能取该区间内的所有整数。

证明: 因为N,d⃗N,\vec dN,d的坐标x1,y1,xd⃗,yd⃗x_1,y_1,x_{\vec d},y_{\vec d}x1​,y1​,xd​,yd​均是整数,所以kkk为整数时,NkN^kNk一定是整点。

  • 显然k=0k=0k=0时NkN^kNk是图中的点(就是NNN)。

  • 对任意的k0>0k_0>0k0​>0,

    • 若Nk0N^{k_0}Nk0​不是图中的点,由于图中的点是正方形∣x∣+∣y∣=n\vert x\vert+\vert y\vert=n∣x∣+∣y∣=n内的所有整点,而Nk0N^{k_0}Nk0​是整点,所以Nk0N^{k_0}Nk0​一定在正方形外,则k>k0k>k_0k>k0​时有

      NNk0→k0=Nk0Nk→k−k0=d⃗\dfrac{\overrightarrow{NN^{k_0}}}{k_0}=\dfrac{\overrightarrow{N^{k_0}N^k}}{k-k_0}=\vec dk0​NNk0​​=k−k0​Nk0​Nk​=d

      由于k0>0,k−k0>0k_0>0,k-k_0>0k0​>0,k−k0​>0,NNk0→,Nk0Nk→\overrightarrow{NN^{k_0}},\overrightarrow{N^{k_0}N^k}NNk0​,Nk0​Nk同向,所以NkN^kNk位于正方形外,不是图中的点。

      总结一下就是:若k=k0k=k_0k=k0​时NkN^kNk不是图中的点,则k>k0k>k_0k>k0​时NkN^kNk都不是图中的点。

    • 若Nk0N^{k_0}Nk0​是图中的点,同理可得Nk0N^{k_0}Nk0​在正方形内,则0<k<k00<k<k_00<k<k0​时有

      NNk→k=NkNk0→k0−k=d⃗\dfrac{\overrightarrow{NN^k}}k=\dfrac{\overrightarrow{N^kN^{k_0}}}{k_0-k}=\vec dkNNk​=k0​−kNkNk0​​=d

      同理有NNk→,NkNk0→\overrightarrow{NN^k},\overrightarrow{N^kN^{k_0}}NNk,NkNk0​同向,所以NkN^kNk位于正方形内,而且是整点,所以是图中的点。

      总结一下就是:若k=k0k=k_0k=k0​时NkN^kNk是图中的点,则0<k<k00<k<k_00<k<k0​时NkN^kNk都是图中的点。

    由此可以得出结论:若kkk为大于000的整数,则必存在k1>0k_1>0k1​>0,使得k⩽k1k\leqslant k_1k⩽k1​时,NkN^kNk都是图中的点;k>k1k>k_1k>k1​时,NkN^kNk都不是图中的点。

  • k<0k<0k<0时,同理可以得到必存在k2<0k_2<0k2​<0,使得k⩾k2k\geqslant k_2k⩾k2​时,NkN^kNk都是图中的点;k<k2k<k_2k<k2​时,NkN^kNk都不是图中的点。

因此kkk满足k2⩽k⩽k1k_2\leqslant k\leqslant k_1k2​⩽k⩽k1​,且能取整数。

事实2: kkk不是整数时,NkN^kNk一定不是图中的点。

证明: NkN^kNk的坐标为(x1+kxd⃗,y1+kyd⃗)(x_1+kx_{\vec d},y_1+ky_{\vec d})(x1​+kxd​,y1​+kyd​)。根据d⃗\vec dd的定义,xd⃗,yd⃗x_{\vec d},y_{\vec d}xd​,yd​是互质的整数。将kkk写成既约分数pq\dfrac pqqp​的形式(p,qp,qp,q互质,q≠1q\neq 1q​=1)。若kxd⃗=pxd⃗qkx_{\vec d}=\dfrac{px_{\vec d}}qkxd​=qpxd​​是整数,则qqq是xd⃗x_{\vec d}xd​的因数,于是p,yd⃗p,y_{\vec d}p,yd​都与qqq互质,则kyd⃗=pyd⃗qky_{\vec d}=\dfrac{py_{\vec d}}qkyd​=qpyd​​就不是整数。反之,若kyd⃗ky_{\vec d}kyd​是整数,则kxd⃗kx_{\vec d}kxd​就不是整数。于是NkN^kNk不是整点,必然不是图中的点。

上面点NaN_aNa​的坐标是分象限讨论得出的,因此继续分象限讨论就可以反解出n0n_0n0​和aaa。例如,在yyy轴正半轴与第一象限组成的区域内,x⩾0,y>0x\geqslant 0,y>0x⩾0,y>0,而此时x=a−1,y=n0−a+1x=a-1,y=n_0-a+1x=a−1,y=n0​−a+1,解得n0=x+y,a=x+1n_0=x+y,a=x+1n0​=x+y,a=x+1。事实上,根据∣x∣+∣y∣=n0\vert x\vert+\vert y\vert=n_0∣x∣+∣y∣=n0​可以直接算出n0n_0n0​。

(n0,a)={(x+y,x+1)x⩾0,y>0(x−y,x−2y+1)x>0,y⩽0(−x−y,−3x−2y+1)x⩽0,y<0(−x+y,−3x+4y+1)x<0,y⩾0(n_0,a)=\begin{cases} (x+y,x+1)&x\geqslant 0,y>0\\ (x-y,x-2y+1)&x>0,y\leqslant 0\\ (-x-y,-3x-2y+1)&x\leqslant 0,y<0\\ (-x+y,-3x+4y+1)&x<0,y\geqslant 0 \end{cases}(n0​,a)=⎩⎪⎪⎪⎨⎪⎪⎪⎧​(x+y,x+1)(x−y,x−2y+1)(−x−y,−3x−2y+1)(−x+y,−3x+4y+1)​x⩾0,y>0x>0,y⩽0x⩽0,y<0x<0,y⩾0​

将kkk所有可能的取值依次代入NakN_a^kNak​的坐标,然后根据上式就可解出n0,an_0,an0​,a,用NaN_aNa​表示。

正六边形

两年前,我和yuzan1830决定建立丑陋的直角坐标系,通过解三角形来表示坐标。当时在讨论正四边形的情况时,我们先解决了邻接距离的问题,再解决了坐标的问题;而在正六边形这里却贸然先整坐标。其实在接下来解决正六边形中的邻接距离的时候,我们已经开辟了另一条道路。

当时我灵光一闪,搞了两个基底e⃗1=(1,0),e⃗2=(cos⁡60∘,sin⁡60∘)\vec e_1=(1,0),\vec e_2=(\cos 60^{\circ},\sin 60^{\circ})e1​=(1,0),e2​=(cos60∘,sin60∘),其实是建立了一个仿射坐标系:


这样图中每一个点可以用一个二维坐标表示,然后本人尝试着用正四边形的方法求邻接距离。这样可靠吗?我们试着将坐标系还原成直角坐标系:


可以看到所有的点仍然在一个六边形内,这个六边形长得有点怪。

{∣x∣⩽n∣y∣⩽n∣x+y∣⩽n\begin{cases} \vert x\vert\leqslant n\\ \vert y\vert\leqslant n\\ \vert x+y\vert\leqslant n \end{cases}⎩⎪⎨⎪⎧​∣x∣⩽n∣y∣⩽n∣x+y∣⩽n​


不过问题的关键在于:这个六边形仍然是一个凸多边形,并且图中的点恰好是六边形内的所有整点。 于是正四边形中的结论仍然成立。

既然如此,能不能把原来的正六边形转化成上图这种六边形,然后重新整坐标?全是整点,岂不爽哉?

于是唯一的问题就是坐标(x,y)(x,y)(x,y)与(n0,a)(n_0,a)(n0​,a)的互相转化。比较恶心,下面直接给出结果:

(x,y)={(−n0+a−1,n0)0<a⩽n0(−n0+a−1,2n0−a+1)n0<a⩽2n0(n0,2n0−a+1)2n0<a⩽3n0(4n0−a+1,−n0)3n0<a⩽4n0(4n0−a+1,−5n0+a−1)4n0<a⩽5n0(−n0,−5n0+a−1)5n0<a⩽6n0(n0,a)={(y,x+y+1)x<0,y⩾−x(x+y,2x+y+1)x⩾0,y>0(x,2x−y+1)x>0,−x<y⩽0(−y,−x−4y+1)x>0,y⩽−x(−x−y,−5x−4y+1)x⩽0,y<0(−x,−5x+y+1)x<0,0⩽y<−x\begin{aligned} (x,y)&=\begin{cases} (-n_0+a-1,n_0)&0<a\leqslant n_0\\ (-n_0+a-1,2n_0-a+1)&n_0<a\leqslant 2n_0\\ (n_0,2n_0-a+1)&2n_0<a\leqslant 3n_0\\ (4n_0-a+1,-n_0)&3n_0<a\leqslant 4n_0\\ (4n_0-a+1,-5n_0+a-1)&4n_0<a\leqslant 5n_0\\ (-n_0,-5n_0+a-1)&5n_0<a\leqslant 6n_0 \end{cases}\\ (n_0,a)&=\begin{cases} (y,x+y+1)&x<0,y\geqslant -x\\ (x+y,2x+y+1)&x\geqslant 0,y>0\\ (x,2x-y+1)&x>0,-x<y\leqslant 0\\ (-y,-x-4y+1)&x>0,y\leqslant -x\\ (-x-y,-5x-4y+1)&x\leqslant 0,y<0\\ (-x,-5x+y+1)&x<0,0\leqslant y<-x \end{cases} \end{aligned}(x,y)(n0​,a)​=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧​(−n0​+a−1,n0​)(−n0​+a−1,2n0​−a+1)(n0​,2n0​−a+1)(4n0​−a+1,−n0​)(4n0​−a+1,−5n0​+a−1)(−n0​,−5n0​+a−1)​0<a⩽n0​n0​<a⩽2n0​2n0​<a⩽3n0​3n0​<a⩽4n0​4n0​<a⩽5n0​5n0​<a⩽6n0​​=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧​(y,x+y+1)(x+y,2x+y+1)(x,2x−y+1)(−y,−x−4y+1)(−x−y,−5x−4y+1)(−x,−5x+y+1)​x<0,y⩾−xx⩾0,y>0x>0,−x<y⩽0x>0,y⩽−xx⩽0,y<0x<0,0⩽y<−x​​

手生疏了,写不了代码了。

纠正

原文曾经提到过:暴力建系的方法可以扩展到任意正多边形。真是这样吗?

把其它正多边形也拿来建立仿射坐标系然后强塞进直角坐标系里试试:

上图为正三角形,图中的点确实是一个三角形内的所有整点,不过明显看起来不舒服。那其它的正多边形呢?

在正nnn边形中(n⩾3n\geqslant 3n⩾3),设基底e1⃗=(1,0),e2⃗=(cos⁡2πn,sin⁡2πn)\vec{e_1}=(1,0),\vec{e_2}=\left(\cos\dfrac{2\pi}n,\sin\dfrac{2\pi}n\right)e1​​=(1,0),e2​​=(cosn2π​,sinn2π​),则对任意0⩽k⩽n−10\leqslant k\leqslant n-10⩽k⩽n−1,需要存在唯一整数对(p,q)(p,q)(p,q),满足

pe1⃗+qe2⃗=(cos⁡2kπn,sin⁡2kπn)p\vec{e_1}+q\vec{e_2}=\left(\cos\dfrac{2k\pi}n,\sin\dfrac{2k\pi}n\right)pe1​​+qe2​​=(cosn2kπ​,sinn2kπ​)

逐个试验也能发现不是所有正多边形都能转化成集中分布的整点。果然正六边形还是最美的。

挑战(二)的一些补充相关推荐

  1. C语言编程>第二十二周 ⑥ 请补充fun函数,该函数的功能是:把字符下标能被2和3同时整除的字符从字符串s中删除,把剩余的字符重新保存在字符串s中。

    例题:请补充fun函数,该函数的功能是:把字符下标能被2和3同时整除的字符从字符串s中删除,把剩余的字符重新保存在字符串s中.字符串s从键盘输入,其长度作为参数传入fun函数. 例如,输入 " ...

  2. [leetcode] 96. 不同的二叉搜索树 +[补充] 不同的二叉树,不同形态的二叉树的个数----catalan数

    leetcode官方的题解:https://leetcode-cn.com/problems/unique-binary-search-trees/solution/bu-tong-de-er-cha ...

  3. NanoPi M4开发opencv图像识别aruco码全过程(超详细)(二:测试补充)

    一.ArUco项目源码简析 声明:以下内容均是在虚拟机Ubuntu系统下进行操作,用开发板Nano Pi的同学亦可同样实现,但这里为了方便截图以及界面复制. 1.首先来看一下ArUco项目的源码结构 ...

  4. 『矩阵论笔记』线性判别分析(LDA)最全解读+python实战二分类代码+补充:矩阵求导可以参考

    线性判别分析(LDA)最全解读+python实战二分类代码! 文章目录 一.主要思想! 二.具体处理流程! 三.补充二中的公式的证明! 四.目标函数的求解过程! 4.1.优化问题的转化 4.2.拉格朗 ...

  5. C++ 二叉搜索树(补充)

      目录 1.搜索二叉树的删除 2.递归销毁搜索二叉树 3.递归复制二叉搜索树,搜索二叉树的深拷贝,析构函数 4.赋值 5.递归版本的查找 *6.递归版本的插入 7.递归版本的删除 代码总览 1.搜索 ...

  6. redhat kvm 5.4 64 创建虚拟主机(二) 不断更新补充

    官方参考 http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5.4/html/Virtualization_Guide/index.h ...

  7. 肖锰:浪潮GS开发平台学习札记(二)——服务器端安装补充及客户端下载安装配置

    服务器端安装出现的问题汇总: 1.  XP下无法启动COM+组件,原因:用户权限不够. 2.  卸载中间件时有可能出现服务无法卸载的情况(体现在重新安装时提示卸载服务) 3.  XP下IIS的问题(没 ...

  8. C语言编程>第二十二周 ④ 从键盘输入一组小写字母,保存在字符数组str中,请补充fun函数,该函数的功能是:把字符数组str中字符下标为偶数的小写字母转换成对应的大写字母,结果仍保存在原数组

    例题:从键盘输入一组小写字母,保存在字符数组str中,请补充fun函数,该函数的功能是:把字符数组str中字符下标为偶数的小写字母转换成对应的大写字母,结果仍保存在原数组中. 例如,输入 " ...

  9. 收益 or 挑战?Serverless 究竟给前端带来了什么

    作者 | 黄子毅(紫益) 阿里前端技术专家 导读:前端开发者是最早享受到 "Serverless" 好处的群体,因为浏览器就是一个开箱即用.甚至无需为计算付费的环境!Serverl ...

  10. 腾讯俞栋:定义下一代智能人机交互,从目标、挑战到实现路径

    感谢阅读腾讯AI Lab微信号第52篇文章,俞栋博士在2018腾讯全球合作伙伴大会"共生·人工智能"分论坛上展示了腾讯AI正在推进的跨领域前沿研究:下一代的多模态智能人机交互. 语 ...

最新文章

  1. 渔民之友:Google X 新项目,用计算机视觉养鱼
  2. matlab反馈模型,—倒立摆状态反馈系统的建模及matlab仿真.docx
  3. Supervisor 进程管理工具
  4. 中国电信计划构建安全新平台
  5. K折交叉验证和pipeline
  6. Android中级教程之----Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
  7. CF917D-Stranger Trees【矩阵树定理,高斯消元】
  8. python之网络编程1-socket-tcp与udp
  9. Python——为什么要在意:模块重载
  10. 一加9硬件规格全曝光:120Hz流体屏+双重快充
  11. python __globals__, __file__
  12. 2015.5.11 string与byte[]相互转换
  13. 系统架构图怎么画_产品架构图到底是怎么“画”出来的?
  14. 数据分析及数据挖掘学习路线
  15. Python 数据分析微专业课程--项目实战09 房价影响因素挖掘1.项目说明2.项目具体要求3.实现思路:4.实现过程:5.结论:
  16. CondaUpgradeError: This environment has previously been operated on by a conda version that‘s newer
  17. 2019最新《炼数成金实战Java高并发程序设计+完整课件》
  18. word中首行缩进、悬挂缩进、左缩进有什么区别?如何操作?
  19. SG3525频率和占空比参数的选取
  20. react native 添加自定义字体

热门文章

  1. java自定义排序函数_JAVA中sort函数的 自定义排序 cmp函数的写法 【java】【cmp】...
  2. linux运行雷神之锤,RTX改造版《雷神之锤II》现已开放下载
  3. Android 开源控件与常用开发框架开发工具类
  4. 网管笔记——网络监控软件使用心得
  5. xxfpmW 的诞生过程
  6. 2020年HIMCM
  7. 后台管理系统的顶部tab标签制作(学习使用)
  8. 京津冀区域AI企业竞争力最强,长三角位列第二,珠三角第三
  9. 谁会成为下一个超级独角兽?世界区块链大会·杭州四大重磅圆桌揭晓!
  10. 管理与维护dns服务器心得,REDHAT 智能DNS服务器管理与维护