确定有理坐标是否在右Sierpinski三角形中


9

所述的Sierpinski三角形是一组其通过用一个三角形起始和反复分裂的所有三角形分成四个全等三角形并除去中心三角形构造在平面上的点。右侧的Sierpinski三角形在和处有角(0,0),如下所示:(0,1)(1,0)

谢尔宾斯基三角形

该集合的一些等效定义如下:

  • n全部针对上述过程的第t次迭代n

  • (x,y)带有0 <= x <= 1和的点0 <= y <= 1,对于所有正整数nnx和y的二进制展开式中的th位都不都是1

  • T = {(0,0),(1,0),(0,1)}

    f上套由以下定义2D点的函数:

    f(X) = {(0,0)} ∪ {(x+t)/2 | x∈X, t∈T}

    然后右谢尔宾斯基三角形是拓扑封闭的的至少固定的点的(通过一组容纳)f

  • S是正方形{(x,y) | 0<=x<=1 and 0<=y<=1}

    g(X) = S ∩ {(x+t)/2 | x∈(X), t∈T}T如上定义)

    然后,右边的Sierpinski三角形是的最大固定点g

挑战

编写一个程序或函数,该程序或函数接受4个整数,a,b,c,d如果(a/b,c/d)属于正确的Sierpinski三角形,则给出真实值,否则给出假值。

计分

这是代码高尔夫球。以字节为单位的最短代码获胜。

测试用例

以下是右边的Sierpinski三角形:

0 1 0 1
0 1 12345 123456
27 100 73 100
1 7 2 7
8 9 2 21
8 15 20 63
-1 -7 2 7

以下不在右侧的Sierpinski三角形中:

1 1 1 1
-1 100 1 3
1 3 1 3
1 23 1 7
4 63 3 66
58 217 4351 7577
-1 -7 3 7

-1 -3 1 1一个有效的输入?
xnor

是的,这是有效的输入。我添加了测试用例以使这一点变得清楚。
cardboard_box

Answers:


5

Python 2,68

lambda n,d,N,D:1>=n/d>=0<=N/D<=1and(n<<abs(D*d))/d&(N<<abs(D*d))/D<1

检查垫圈成员的好方法很丑。如果我们保证输入是非负的并且在单位平方中,我们将有38个:

lambda n,d,N,D:(n<<D*d)/d&(N<<D*d)/D<1

想法是,通过检查二进制分数是否按位AND扩展至0,来检查点是否位于垫片内。要获得k扩展的第一个字符,我们将分子k除以分母之前将分子位左移。 。我们需要k足够大以捕捉重复。我们注意到,二元展开n/d最多具有周期d,因此联合展开最多具有周期d*D,因此k=d*D就足够了。

剩下的就是检查分数是否在框中,并与like之类的输入隔离-1/-3

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.