【问题标题】:Efficiently detect that rational numbers are equal有效检测有理数是否相等
【发布时间】: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


【解决方案1】:

您可以通过比较位长来过滤掉许多不相等的分数对。令 l(a) = floor(log2(a)) + 1 a 的位长。如果 a/b = c/dl(a ) + l(d) = l(c) + l em>(b).

当您第一次比较长度和比较产品时,您可以使用它来加快速度,前提是长度之和相等。

【讨论】:

  • 正如我所提到的,匹配的可能性很高,因为我已经在做一个大概的检查,所以像这样提前外出并不能节省任何额外的时间。
  • 但是计算近似值应该比比较位长慢得多。
【解决方案2】:

第二次尝试 ;) 如果您必须反复检查新数字是否包含集合,您应该将相对质数部分存储在有序集合中。集合的比较函数应该首先比较计数器,如果计数器相等,然后再比较分母。比较可以在线性时间内完成,因此在 M 个项目的有序集中找到一个元素需要 O(N log M) 步骤。减少一小部分成本 O(N ²)。因此,测试一个数字的包容性需要 O(N ² + N log M) 个步骤,并计算设置 O(MN ²)。

编辑:您可以使用散列集,而不是使用排序集或树集,这将搜索所需的步骤数减少到 O( N ² + N) = O(N ²)。

【讨论】:

  • 正如我所提到的,由于前期 GCD 成本降低分数会降低性能(嗯,实际上扩展了欧几里得,但差异相同)。
  • 对于前期减少,您不需要扩展 GCD。更简单的计算不会降低复杂度,但会减少实际运行时间。我会在没有近似值的情况下进行预计算,因为我认为减少会给您带来更大的灵活性,并且如果没有减少,您将无法为您的问题找到有效的算法。
【解决方案3】:

如果您已经预先计算了浮点近似值,这对您的情况不会有太大帮助;它可能仍会在管道中节省一些时间(或一些近似值)。

您检查 a、b、c 和 d 的整数值。

有理数相同意味着它们描述了通过原点的同一条线。

如果c > a,那么它也一定是d > b,否则我们会在右下角的灰色区域;如果 c 2 bigint 比较排除其中的 N/2。

剩下的 50%,我们可以排除一半,注意如果 a > b,那么黑线在第一和第三象限的平分线下方,并且必须是 c > d,否则 C/D 将在平分线的另一边;我们将处于无法平等的顶级橙色部门。相同或 a

您还可以通过观察对于任何 k,a 到 kb 的关系必须与 c 和 k 之间的关系相同来扩展此方法d 对于 a/b 和 c/d平等;如果 k 是 2 的整数幂,则允许进行多种可能的优化。

(当然,在某些时候,这样做的成本会超过a*d==b*c 测试的成本)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 2013-01-27
    • 2019-08-11
    • 2021-07-11
    • 2012-09-19
    • 2014-12-27
    相关资源
    最近更新 更多