我有许多有理数的集合,每个数的分子和分母存储为一个大的(数百或数千位)无符号整数。我希望能够有效地测试集合中是否有任何给定的有理数a/b
等于集合中的任何其他有理数c/d
。高效检测有理数是否相等
最直接的方法是测试a*d == b*c
是否当然,但我希望比计算完整产品更有效。
在我的具体使用情况的一些注意事项:
- 的对,我会测试实际上已经等于(因为我已经预先计算,并通过他们的浮点近似值第一比较它们的可能性很大),所以如果他们不平等,那么早出来并不会节省我很多时间。
- 我很喜欢为每个数字预先计算额外数据,但每个数字只会用于少数比较,所以昂贵的预计算(例如素因子分解)可能不值得。
- 偶尔的假阴性会很好,但误报不会。
我想这可能是理论上是不可能的,但为了以防万一把它扔出去的蜂群思维。
普通的方法是将归一化A/B为(a/GCD(A,B))/(B/GCD(A,B))。为什么它不适合你? – deniss
@deniss因为计算两个大数字的GCD是相当昂贵的操作。 – Sneftel
什么是您的数据大小和速度要求? GMP为GCD提供了[一些不错的优化算法](https://gmplib.org/manual/Subquadratic-GCD.html#Subquadratic-GCD) – deniss