挑战(二)是一个数学问题,但原文中缺乏严谨的数学解释;而且yuzan1830本来的问题是射线经过了哪些点,而不是多少点。因此这里补充两方面的内容:
- 邻接距离(邻接向量)的证明。
- 如何将坐标 ( x , y ) (x,y) (x,y)转化为 N a N_a Na的形式。
正四边形
首先是第 n 0 n_0 n0层的第 a a a个点的坐标 N a ( x , y ) N_a(x,y) Na(x,y):
( x , y ) = { ( a − 1 , n 0 − a + 1 ) 0 < a ⩽ n 0 ( 2 n 0 − a + 1 , n 0 − a + 1 ) n 0 < a ⩽ 2 n 0 ( 2 n 0 − a + 1 , − 3 n 0 + a − 1 ) 2 n 0 < a ⩽ 3 n 0 ( − 4 n 0 + a − 1 , − 3 n 0 + a − 1 ) 3 n 0 < a ⩽ 4 n 0 (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⩽n0n0<a⩽2n02n0<a⩽3n03n0<a⩽4n0
坐标的得出还是比较直观的,原文如下,这里不再解释。
考虑 y y y轴正半轴与第一象限组成的区域,通过观察不难发现这个区域中第 n 0 n_0 n0层的点包括 N 1 , N 2 , … , N n 0 N_1,N_2,\dots,N_{n_0} N1,N2,…,Nn0,且横坐标顺时针递增。 同理, x x x轴正半轴与第四象限组成的区域中的点包括 N n 0 + 1 , N n 0 + 2 , ⋯ , N 2 n 0 N_{n_0+1},N_{n_0+2},\cdots,N_{2n_0} Nn0+1,Nn0+2,⋯,N2n0,且横坐标顺时针递减。 y y y轴负半轴与第三象限组成的区域中的点包括 N 2 n 0 + 1 , N 2 n 0 + 2 , ⋯ , N 3 n 0 N_{2n_0+1},N_{2n_0+2},\cdots,N_{3n_0} N2n0+1,N2n0+2,⋯,N3n0,且横坐标顺时针递减。 x x x轴负半轴与第二象限组成的区域中的点包括 N 3 n 0 + 1 , N 3 n 0 + 2 , ⋯ , N 4 n 0 N_{3n_0+1},N_{3n_0+2},\cdots,N_{4n_0} N3n0+1,N3n0+2,⋯,N4n0,且横坐标顺时针递增。
容易发现 ∣ x ∣ + ∣ y ∣ = n 0 \vert x\vert+\vert y\vert=n_0 ∣x∣+∣y∣=n0,即点 N a N_a Na在以原点为中心、半对角线长为 n 0 n_0 n0的倾斜正方形上。又因为 a a a的取值是连续整数, x , y x,y x,y中 a a a的系数的绝对值为 1 1 1,所以 x , y x,y x,y的取值也是连续的整数,图中的点一定是满足 ∣ x ∣ + ∣ y ∣ ⩽ n \vert x\vert+\vert y\vert\leqslant n ∣x∣+∣y∣⩽n的所有整点。
对于图中两点 N ( x 1 , y 1 ) , M ( x 2 , y 2 ) N(x_1,y_1),M(x_2,y_2) N(x1,y1),M(x2,y2),记 N M → = ( x 2 − x 1 , y 2 − y 1 ) = r ⃗ \overrightarrow{NM}=(x_2-x_1,y_2-y_1)=\vec r NM=(x2−x1,y2−y1)=r,邻接向量为 d ⃗ \vec d d。原文给出的结论是
d ⃗ = r ⃗ gcd ( Δ x , Δ y ) = r ⃗ gcd ( x 2 − x 1 , y 2 − y 1 ) \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
下面给出证明。记点 N N N加上 k k k个 d ⃗ \vec d d后得到的点 ( x 1 + k x d ⃗ , y 1 + k y d ⃗ ) (x_1+kx_{\vec d},y_1+ky_{\vec d}) (x1+kxd,y1+kyd)为点 N k N^k Nk。只需证明两件事实:
事实1: 若 N k N^k Nk是图中的点,则 k k k一定属于一段连续区间,且 k k k一定能取该区间内的所有整数。
证明: 因为 N , d ⃗ N,\vec d N,d的坐标 x 1 , y 1 , x d ⃗ , y d ⃗ x_1,y_1,x_{\vec d},y_{\vec d} x1,y1,xd,yd均是整数,所以 k k k为整数时, N k N^k Nk一定是整点。
-
显然 k = 0 k=0 k=0时 N k N^k Nk是图中的点(就是 N N N)。
-
对任意的 k 0 > 0 k_0>0 k0>0,
-
若 N k 0 N^{k_0} Nk0不是图中的点,由于图中的点是正方形 ∣ x ∣ + ∣ y ∣ = n \vert x\vert+\vert y\vert=n ∣x∣+∣y∣=n内的所有整点,而 N k 0 N^{k_0} Nk0是整点,所以 N k 0 N^{k_0} Nk0一定在正方形外,则 k > k 0 k>k_0 k>k0时有
N N k 0 → k 0 = N k 0 N k → k − k 0 = d ⃗ \dfrac{\overrightarrow{NN^{k_0}}}{k_0}=\dfrac{\overrightarrow{N^{k_0}N^k}}{k-k_0}=\vec d k0NNk0=k−k0Nk0Nk=d
由于 k 0 > 0 , k − k 0 > 0 k_0>0,k-k_0>0 k0>0,k−k0>0, N N k 0 → , N k 0 N k → \overrightarrow{NN^{k_0}},\overrightarrow{N^{k_0}N^k} NNk0,Nk0Nk同向,所以 N k N^k Nk位于正方形外,不是图中的点。
总结一下就是:若 k = k 0 k=k_0 k=k0时 N k N^k Nk不是图中的点,则 k > k 0 k>k_0 k>k0时 N k N^k Nk都不是图中的点。
-
若 N k 0 N^{k_0} Nk0是图中的点,同理可得 N k 0 N^{k_0} Nk0在正方形内,则 0 < k < k 0 0<k<k_0 0<k<k0时有
N N k → k = N k N k 0 → k 0 − k = d ⃗ \dfrac{\overrightarrow{NN^k}}k=\dfrac{\overrightarrow{N^kN^{k_0}}}{k_0-k}=\vec d kNNk=k0−kNkNk0=d
同理有 N N k → , N k N k 0 → \overrightarrow{NN^k},\overrightarrow{N^kN^{k_0}} NNk,NkNk0同向,所以 N k N^k Nk位于正方形内,而且是整点,所以是图中的点。
总结一下就是:若 k = k 0 k=k_0 k=k0时 N k N^k Nk是图中的点,则 0 < k < k 0 0<k<k_0 0<k<k0时 N k N^k Nk都是图中的点。
由此可以得出结论:若 k k k为大于 0 0 0的整数,则必存在 k 1 > 0 k_1>0 k1>0,使得 k ⩽ k 1 k\leqslant k_1 k⩽k1时, N k N^k Nk都是图中的点; k > k 1 k>k_1 k>k1时, N k N^k Nk都不是图中的点。
-
-
k < 0 k<0 k<0时,同理可以得到必存在 k 2 < 0 k_2<0 k2<0,使得 k ⩾ k 2 k\geqslant k_2 k⩾k2时, N k N^k Nk都是图中的点; k < k 2 k<k_2 k<k2时, N k N^k Nk都不是图中的点。
因此 k k k满足 k 2 ⩽ k ⩽ k 1 k_2\leqslant k\leqslant k_1 k2⩽k⩽k1,且能取整数。
事实2: k k k不是整数时, N k N^k Nk一定不是图中的点。
证明: N k N^k Nk的坐标为 ( x 1 + k x d ⃗ , y 1 + k y d ⃗ ) (x_1+kx_{\vec d},y_1+ky_{\vec d}) (x1+kxd,y1+kyd)。根据 d ⃗ \vec d d的定义, x d ⃗ , y d ⃗ x_{\vec d},y_{\vec d} xd,yd是互质的整数。将 k k k写成既约分数 p q \dfrac pq qp的形式( p , q p,q p,q互质, q ≠ 1 q\neq 1 q=1)。若 k x d ⃗ = p x d ⃗ q kx_{\vec d}=\dfrac{px_{\vec d}}q kxd=qpxd是整数,则 q q q是 x d ⃗ x_{\vec d} xd的因数,于是 p , y d ⃗ p,y_{\vec d} p,yd都与 q q q互质,则 k y d ⃗ = p y d ⃗ q ky_{\vec d}=\dfrac{py_{\vec d}}q kyd=qpyd就不是整数。反之,若 k y d ⃗ ky_{\vec d} kyd是整数,则 k x d ⃗ kx_{\vec d} kxd就不是整数。于是 N k N^k Nk不是整点,必然不是图中的点。
上面点 N a N_a Na的坐标是分象限讨论得出的,因此继续分象限讨论就可以反解出 n 0 n_0 n0和 a a a。例如,在 y y y轴正半轴与第一象限组成的区域内, x ⩾ 0 , y > 0 x\geqslant 0,y>0 x⩾0,y>0,而此时 x = a − 1 , y = n 0 − a + 1 x=a-1,y=n_0-a+1 x=a−1,y=n0−a+1,解得 n 0 = x + y , a = x + 1 n_0=x+y,a=x+1 n0=x+y,a=x+1。事实上,根据 ∣ x ∣ + ∣ y ∣ = n 0 \vert x\vert+\vert y\vert=n_0 ∣x∣+∣y∣=n0可以直接算出 n 0 n_0 n0。
( n 0 , a ) = { ( x + y , x + 1 ) x ⩾ 0 , y > 0 ( x − y , x − 2 y + 1 ) x > 0 , y ⩽ 0 ( − x − y , − 3 x − 2 y + 1 ) x ⩽ 0 , y < 0 ( − x + y , − 3 x + 4 y + 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
将 k k k所有可能的取值依次代入 N a k N_a^k Nak的坐标,然后根据上式就可解出 n 0 , a n_0,a n0,a,用 N a N_a Na表示。
正六边形
两年前,我和yuzan1830决定建立丑陋的直角坐标系,通过解三角形来表示坐标。当时在讨论正四边形的情况时,我们先解决了邻接距离的问题,再解决了坐标的问题;而在正六边形这里却贸然先整坐标。其实在接下来解决正六边形中的邻接距离的时候,我们已经开辟了另一条道路。
当时我灵光一闪,搞了两个基底 e ⃗ 1 = ( 1 , 0 ) , e ⃗ 2 = ( cos 6 0 ∘ , sin 6 0 ∘ ) \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)与 ( n 0 , a ) (n_0,a) (n0,a)的互相转化。比较恶心,下面直接给出结果:
( x , y ) = { ( − n 0 + a − 1 , n 0 ) 0 < a ⩽ n 0 ( − n 0 + a − 1 , 2 n 0 − a + 1 ) n 0 < a ⩽ 2 n 0 ( n 0 , 2 n 0 − a + 1 ) 2 n 0 < a ⩽ 3 n 0 ( 4 n 0 − a + 1 , − n 0 ) 3 n 0 < a ⩽ 4 n 0 ( 4 n 0 − a + 1 , − 5 n 0 + a − 1 ) 4 n 0 < a ⩽ 5 n 0 ( − n 0 , − 5 n 0 + a − 1 ) 5 n 0 < a ⩽ 6 n 0 ( n 0 , a ) = { ( y , x + y + 1 ) x < 0 , y ⩾ − x ( x + y , 2 x + y + 1 ) x ⩾ 0 , y > 0 ( x , 2 x − y + 1 ) x > 0 , − x < y ⩽ 0 ( − y , − x − 4 y + 1 ) x > 0 , y ⩽ − x ( − x − y , − 5 x − 4 y + 1 ) x ⩽ 0 , y < 0 ( − x , − 5 x + 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⩽n0n0<a⩽2n02n0<a⩽3n03n0<a⩽4n04n0<a⩽5n05n0<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
手生疏了,写不了代码了。
纠正
原文曾经提到过:暴力建系的方法可以扩展到任意正多边形。真是这样吗?
把其它正多边形也拿来建立仿射坐标系然后强塞进直角坐标系里试试:
上图为正三角形,图中的点确实是一个三角形内的所有整点,不过明显看起来不舒服。那其它的正多边形呢?
在正 n n n边形中( n ⩾ 3 n\geqslant 3 n⩾3),设基底 e 1 ⃗ = ( 1 , 0 ) , e 2 ⃗ = ( 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 − 1 0\leqslant k\leqslant n-1 0⩽k⩽n−1,需要存在唯一整数对 ( p , q ) (p,q) (p,q),满足
p e 1 ⃗ + q e 2 ⃗ = ( cos 2 k π n , sin 2 k π 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π)
逐个试验也能发现不是所有正多边形都能转化成集中分布的整点。果然正六边形还是最美的。