【发布时间】:2017-04-05 07:20:46
【问题描述】:
我有许多有理数的集合,每个有理数的分子和分母都存储为一个大(数百或数千位)无符号整数。我希望能够有效地测试集合中任何给定的有理数 a/b 是否等于集合中的任何其他有理数 c/d。
当然,最直接的方法是测试是否a*d == b*c,但我想要比计算完整产品更有效的方法。
关于我的特定用例的一些说明:
- 我将要测试的对很有可能实际上是相等的(因为我已经预先计算并首先通过它们的浮点近似值比较它们),所以如果它们不相等,那么早出线不会救我很多时间。
- 我可以为每个数字预先计算额外的数据,但每个数字只会用于少数比较,因此昂贵的预先计算(例如素数分解)可能不值得。
- 偶尔出现误报是可以的,但误报则不行。
我认为这在理论上可能是不可能的,但为了以防万一,把它扔给蜂巢的头脑。
【问题讨论】:
-
常用方法是将 a/b 归一化为 (a/gcd(a,b)) / (b/gcd(a,b))。为什么它对你不起作用?
-
@deniss 因为计算两个大数的 GCD 是一项相当昂贵的操作。
-
您的数据大小和速度要求是多少? GMP 有 some nice optimized algorithms 用于 GCD
-
@deniss 数据大小高达数千位,当我们尝试预先减少有理数时,性能下降了。
-
您可以使用 FFT 将数字卷积(即 bigint 乘法)转换为逐点乘法,然后在进行 IFFT 后比较两个乘积。但我不知道天真的乘法到 FFT 乘法的交叉点在哪里。
标签: biginteger integer-arithmetic rational-numbers