0

坐标为 (P x , P y ) 和 (Q x , Q y ) 的两点 P 和 Q满足以下性质:

  1. 坐标 P x、 P y、 Q x和 Q y是整数。
  2. P x = -Q x
  3. 直线 PQ 与一个圆心为 (0, 0) 且半径为r的圆相切
  4. 0 < P xa对于某个整数限制a

如何找到所有这样的点 P 和 Q 对?

例如,在下图中,我有一个半径r =2 且极限a = 6 的圆。点对 P = (6, 2) 和 Q = (−6, −7) 是一个解,因为:

  1. P 和 Q 的坐标是整数。
  2. P x = -Q x
  3. 线 PQ 与圆相切。
  4. 0 < P x ≤ 6。

但这只是一对。我需要找到所有这样的对。有有限数量的解决方案。

那么,有没有办法检查点的坐标是否与圆相切并且是整数,然后将它们全部列出?我已经查看了斜率方程和从圆心到直线方程的最短路径,但是,在第一种情况下,它需要知道坐标(我可以通过强制每个数字来做到这一点,但我看不到模式,因为我的直觉告诉我应该应用某种方程),在第二种情况下,我必须知道斜率方程。

这是我想出的算法,但我认为它不正确或不够好:

  1. 对于所有 1 ≤ P xa和 -<em>a ≤ Q x ≤ -1,求斜率方程y = mx + b 。
  2. 对于每个y = mx + b检查它是否与圆相切(如何做到这一点???)
  3. 如果为真,则返回该对
4

1 回答 1

0

线 PQ 有方程:

(x-Px)/(Qx-Px)=(y-Py)/(Qy-Py) or

(x-Px)*(Qy-Py)-(y-Py)*(Qx-Px)=0 or

x*(Qy-Py)+y*(Px-Qx)-Px*Qy+Px*Py+Py*Qx-Py*Px = 

x*(Qy-Py)+y*2*Px-Px*(Qy+Py)=0

从零点到这条线的距离(圆半径)是

r=Px*(Qy+Py)/Sqrt((2*Px)^2+(Qy-Py)^2)

请注意,半径和提名者是整数,因此分母也必须是整数。当 2*Px 和 |Qy-Py| 时是可能的 是一些毕达哥拉斯三元组的成员(例如 - 12^2+9^2 =15^2)。因此您可以使用上述链接中的“生成三元组”方法来显着减少搜索并找到所有可能的点对(带半径检查)

  Px = k * m * n   (for m>=n, radius < k*m*n <= a)
  |Qy-Py| = k * (m^2 - n^2)

使用 a=6 最大值 n 为 2,您的示例对应于 (k, m, n) 集 (3, 2, 1)

于 2013-01-18T11:50:29.543 回答