整数行列式 4 乘 4 的符号

计算科学 C++ 计算几何 表现
2021-12-01 23:34:38

我在本出版物的上下文中:http: //www.gilbertbernstein.com/resources/booleans2009.pdf

我对我的点坐标应用了量化:所有坐标都是整数,位于 [0, 2 power 20] 中。表示坐标的 C++ 类型是 int64_t。

平面 p 用整数齐次坐标 (a, b, c, d) 表示:

p = { (x, y, z) | ax + by + cz + d = 0 }

点 X 可以表示为 3 个平面 (p, q, r)(提供有效条件,参见出版物)。

我有一个有效的点 X 和一个平面 s。我想知道 X 是在正面、负面还是在 s 上。根据该出版物,我需要计算这些行列式的符号:

| p_a, p_b, p_c, p_d |
| q_a, q_b, p_c, q_d |
| r_a, r_b, p_c, r_d |
| s_a, s_b, p_c, s_d |

和:

| p_a, p_b, p_c|
| q_a, q_b, p_c|
| r_a, r_b, p_c|

量化界限意味着以下界限:

|p_a|, |p_b| and |p_c| < 2 pow 40

|p_d| < 2 pow 60

如何准确快速地计算该行列式的符号?使用 BigInt 或任何基于中国剩余定理的东西太慢了(虽然我还没有尝试过 GMP 库)...... 哪些库可以解决这个问题?

线索

2个回答

有几个选项可用于派生具有任意精度的谓词。

如果您使用 integers,那么您可以使用 Haramard 不等式(参见标准代数教科书,例如 Greub 1975, Linear Algebra, Springer Verlag)。这个不等式表示行列式的绝对值不大于列向量长度的乘积。您可以使用它来根据系数的位数来限制行列式的位数。对于 2D Voronoi 图的in_circle谓词的 4x4 行列式,如果坐标介于KK, 行列式的绝对值小于32K4.如果您使用长整数(64 位),对于 2D Voronoi 图,K=23170确保您获得足够的精度。如果您在 3D 中,那么 64 位可能不够,您将需要使用 bigint 包(如您所建议的 GNU GMP)。可能首先使用标准 64 位整数进行计算并动态检测是否发生溢出,然后仅在需要时使用 bigint 包重新启动计算。

如果您使用浮点数,请参阅我对这个问题的回答,参考我的调查文章和软件包。这个想法是用浮点数以及指示符号是否准确的界限来计算行列式,然后如果不是这种情况,则以(更昂贵的)任意精度重新启动计算。我的软件包2可用于派生涉及交集的谓词,如我的文章3中所述。这使用了 Shewchuk 的扩展(在问题中提到)结合算术滤波器4. 这种策略比 Shewchuk 的原始包中使用的自适应评估更容易实现,并且相当容易推导出交叉点所需的新谓词。

更多想法/参考:我推荐我的朋友 ( QuickCSG ) 撰写的关于同一主题的以下文章(对网格上的布尔运算的稳健评估)。它将交集问题重铸为仅依赖于极少数谓词的算法,可以合理地轻松定义简单性的有效模拟。

本质上,我们正在尝试计算整数矩阵的行列式。看看这些是否有帮助:

整数矩阵的精确行列式,Takeshi Ogita http://www.eng.nus.edu.sg/civil/REC2010/documents/papers/038.pdf

计算整数矩阵行列式的符号或值:复杂性调查,Erich Kaltofena,Gilles Villard http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.21.9676&rep=rep1&type=pdf

此外,如果我们用更多的几何术语来思考,我们总是可以组合出一种数值上更稳定、易于计算的方法来确定这一点。n=(a,b,c)表示平面的法线和pR3点。让我们在这架飞机上随机取一个点p0=[0,0,c/d]T并构造一个方向向量d=pp0. 该点位于平面的正侧当且仅当:

nd>0positive sidend<0negative side

对于整数值/量化输入,执行这些操作也可能相当容易,其中实际上可以使用 BigInt。