我在这里展示如何解决一个“困难”的问题实例,我认为这种方法可以推广。我已经在原帖的评论中放置了另一个更简单的实例。
考虑以下两行:
10000019 * X - 10000015 * Y + 909093 >= 0 (L1)
-10000022 * X + 10000018 * Y + 1428574 >= 0 (L2)
A = 10000019, B = -10000015, C = -909093
交点为H:
Hx = -5844176948071/3, Hy = -5844179285738/3
对于一个点M(X,Y),其到点H的距离的平方是:
HM^2 = (9*X^2+35065061688426*X
+68308835724213587680825685
+9*Y^2+35065075714428*Y)/9
g = gcd(A,B) = 1: 表示L1方程 A*X+B*Y+909093
可以取任何整数值。
贝祖定理系数 U=2500004 和 V=2500005 验证如下:
A * U + B * V = 1
我们现在将问题按照(K,T)“对偶”基进行重写,由此得到以下内容:
X = T*U - K*B
Y = T*V + K*A
替换后,我们得到:
T+909093 >= 0
2*T+12*K+1428574 >= 0
minimize 112500405000369*T^2
+900003150002790*T*K
+1800006120005274*K^2
+175325659092760325844*T
+701302566240903900522*K
+Constant
进一步翻译后(先在T上,然后在K上,以最小化第二个方程中的常数),可得 T=T1-909093,K=K1+32468:
T1 >= 0
2*T1+4+12*K1 >= 0
minimize 112500405000369*T1^2
+300001050000930*T1
+900003150002790*T1*K1
+1200004080003516*K1
+1800006120005274*K1^2
+Constant
我提出的算法是在T1上循环。实际上,我们不需要在这里进行循环,因为最佳结果是由T1=K1=0给出的,对应于:
X = -1948055649352, Y = -1948056428573
以下是我最初的帖子。
这里有另一种算法的想法。它可能有效,但我没有实现它...
通过适当改变符号以匹配(x,y)的位置,问题可以被写成:
A*X+B*Y>=C (line D)
a*X+b*Y>=c (line d)
minimize the distance between M(X,Y) and H, the intersection point
A*b != a*B (intersection is defined)
A,B,C,a,b,c,X,Y all integers
(AX+BY)所达到的所有值的集合是所有g=gcd(A,B)的倍数集合,并且存在整数(u,v),使得Au+Bv=g(贝祖定理)。从具有整数坐标(X0,Y0)的点开始,所有具有相同值的AX+BY的整数坐标点为(X0-KB/g,Y0+KA/g),其中K为所有整数。
为了解决这个问题,我们可以在与D平行并包含整数坐标点的线上循环,逐渐增加到离H的距离。
计算g、u、v和H(H的坐标可能不需要,我们只需要与距离对应的二次形式的系数)。
T0 = ceil(C/g)
从T = T0开始循环
a. 找到最小(或最大,取决于aB-bA的符号)的整数K,满足a*(Tu-KB/g)+b*(Tv+KA/g)>=c
b. 如果更靠近H,请保留点(Tu-KB/g,Tv+KA/g)
c. 当(T-T0)对应于距离D的最佳结果时退出循环,否则继续使用T+=1