比较有理数


12

给定a,b,c,dNb,d{0}

ab<cdad<cb

我的问题是:

给定a,b,c,d

  1. 假设我们可以决定x<yZO(|x|+|y|),是有决定的任何方式ad<cb,而无需预形成的乘法(或分割),adcb。还是有某种证明是不可能的。
  2. 有没有一种比分母相乘更快的方法来比较有理数。

1
@PKG,但是乘法将花费比线性时间更多的时间。我想我们想更快地解决这个问题。
2012年

1
棘手的情况是,当一个时间间隔包含另一个,例如[a,d][b,c]
PKG 2012年

1
您隐式地假定d具有相同的符号。否则,不平等方向会改变。bd
Ran G.

1
(1)乘法几乎是线性的(搜索Fürer算法)。(2)至少在代数数论的上下文中,“有理数整数”实际上仅表示整数。您想说“有理数”或“有理数”。
Yuval Filmus 2012年

1
另请参见明显重复如何比较有理数?
vzn13年

Answers:


5

我目前的研究:

初步尝试一些一般规则

可以尝试制定一些一般规则来解决有理比较:

假设所有正数a,b,c,d

a<bcdab<cd
这基本上意味着,如果左侧小于一个,而右侧至少为一个,则左侧小于右侧。同样:

abcdabcd

另一个规则:

(b>d)(ac)[ab<cd]
我认为此规则是合乎逻辑的,因为分母越大,数字越小,而数字越大分子,数字越大。因此,如果左侧的分母较大分子较小,则左侧较小。

从这里开始,我们将假定,因为否则我们可以使用上述规则来解决它,或者将问题反转为,无论如何我们都会遇到这种情况。Ça<cb<dcd<?ab

规则: 这规则基本上指出,您始终可以从分母中减去分子,并将结果设置为分子,以获得等价问题。我将省略证明。

(ba)b<(dc)d[ab<cd]|a<c,b<d

ab<cadb[ab<cd]|a<c,b<d

此规则允许您从等效分子的右分子和分母中减去左分子和分母。

当然有伸缩性:

akbk<cd[ab<cd]|a<c,b<d
您可以使用缩放使上述减法规则更有意义。

使用这些规则,您可以玩弄事物,以巧妙的组合反复应用它们,但在某些情况下数字接近且具有病态性。

通过应用前面的规则,可以将所有这些问题减少为:

ab<ap+qbp+qab<qq|a>q,b>q

有时您可以立即直接解决此问题,有时则不能。病理病例通常为以下形式:

ab<cd|a>c,b>d,cO(a),dO(b)

然后,将其翻转,得到的结果相同,只差一点点。规则+翻转的每次应用都会将其减少一位/位。AFAICT,除非您在病理情况下应用次(每个数字/位一次,就不能快速解决它,而否定了它们的明显优势。O(n)

开放的问题?

我意识到这个问题似乎比当前的一些开放性问题更难。

一个更弱的问题是确定:

ad=?bc

但更弱:

ad=?c

这是验证乘法的未解决问题。它较弱,因为您是否可以确定,那么您可以轻松确定,通过使用算法测试两次,,。如果其中一个是正确的,则您知道。ad<?bcad=?bcad<?bcbc<?adadbc

现在,是一个开放的问题,至少在1986年是这样:ad=?c

乘法和除法的复杂性。让我们从非常简单的等式ax = b开始。当考虑整数时,可以通过除以零的整数除法来测试其可溶性并找到解x。对于检查给定的解x,整数乘法就足够了,但是是否存在更快的验证方法是一个有趣的开放问题。

ARNOLDSCHÖNHAGE根据计算复杂度进行方程求解

非常有趣的是,他还提到了验证矩阵乘法的问题:

一个有趣的问题是矩阵乘法的验证,即检查给定C的AB = G是否可以更快地完成。

ARNOLDSCHÖNHAGE根据计算复杂度进行方程求解

此问题已得到解决,并且确实有可能使用随机算法在时间内进行验证(其中是输入矩阵的大小,因此它基本上是线性时间)。输入的大小)。考虑到唐津整数乘法与之后的矩阵乘法算法的相似性,我不知道是否有可能将整数乘法简化为矩阵乘法,尤其是在它们的相似性上。然后也许可以通过某种方式利用矩阵乘法验证算法进行整数乘法。O(n2)n×n

无论如何,据我所知,这仍然是一个开放的问题,更重要的问题肯定已打开。我很好奇,如果解决相等性验证问题是否会对比较不平等性验证问题产生影响。ad<?cd

我们的问题的一个小变化是,如果保证将分数减小到最低限度;在这种情况下,很容易判断。这对减少比例的比较验证有影响吗?ab=?cd

一个更微妙的问题,如果我们有一种方法可以测试,这会扩展到测试?我看不到您如何像那样使用这两种方式。ad<?cad=?cad<?cd

有关:

  • 有限自动机对非常规语言的近似识别

    他们在近似乘法和随机验证方面做了一些工作,我对此并不完全了解。

  • math.SE:如何比较两个乘法而不乘?
  • 假设我们可以在多项式时间内对尽可能多的预处理,是否可以在线性时间内求解?cab=c
  • 有线性时间不确定的整数乘法算法吗?参见http://compgroups.net/comp.theory/nondeterministic-linear-time-multiplication/1129399

    有众所周知的算法,可以将n位数字与O(n log(n)log(log(n)))复杂度相乘。而且我们不能做得比O(n)更好,因为至少我们必须查看整个输入。我的问题是:对于一类合适的“不确定性”算法,我们实际上可以达到O(n)吗?

    更准确地说,是否有一种算法可以接受两个n位二进制数“ a”和“ b”以及一个2n位二进制数“ c”,并在O(n)时间内告诉您“ a * b = c”?如果不是,是否还有其他形式的证书C(a,b,c),以便算法可以使用它在线性时间内测试产品?如果不是线性时间,那么测试产品的问题至少在渐近程度上比计算问题容易吗?这些方面的任何已知结果都将受到欢迎。

    约翰。

    ―johnh4717


1

这是一个非常不全面的尝试。假设我们只能在决策器中使用(恒定数量的)加法和减法,以及恒定数量的 wrt预定义数字。换句话说,我们可以在器中执行恒定数量的,等。那么我们唯一可以计算的量的形式为其中是预定义的常数。注意,可以在时间计算。modmod 2mod 3q=k1a+k2b+k3c+k4d=kiakqO(|a|)

编辑 该决策者旨在确定 iff。考虑以作为。钻头由其在表面位置决定,该表面是4维双曲面。如果我们在输入空间中有一个点,则上面的决策器可以计算在该输入点的有限距离内的点,即那些点等。这定义了4 d空间中的长方体。B:B=1ad>bca,b,c,dR4Bad=bc(a,b,c,d)q:|qa|=k1,

(如何使其更精确?)从长方体到曲面的距离通常是无界的,因此决定者无法计算曲面


抱歉,我没有回应。我认为这可能超出了我的理解范围,与此同时,我一直在忙于自己研究可能的答案。
Realz Slaw 2012年

1

好问题。您会接受置信度吗?

也许做近似除法。即

要计算a / b的边界近似商,请右移a ceil(log_2(b))并同时右移floor(log_2(b))。然后我们知道准确的商在这两个值之间。

然后,根据这四个整数的相对大小,一个人可以排除某些情况,并获得100%的置信度。

可以对除2以外的基数重复该过程,并通过一系列这样的操作来增加置信度,直到以某种方式观察到符号/抢七的变化?

这是我的一种方法的初稿。


如果您看一下我的“当前研究”答案,我认为这些规则可以起到一定作用。您可以继续前进,如果它达到了第一个规则中的一个,则很多时候会获得100%的信心;在最坏的情况下,您会重复重复执行后一个规则,每回合删除一点,就像您所建议的那样。但是,我的问题是关于确定性(或者比乘法好,也会满足这个问题),或者至少是一个概率较小的随机算法失败。O(n)O(nlogn)
Realz Slaw 2012年

另外,如果可以验证这是一个开放性问题,并且从本质上讲,不比验证困难(请参阅我的“当前研究”答案的“ 开放性问题 ”一节),或者是否存在其他有趣的现有研究或结果关于这一点,那也可能是一个可以接受的答案。ab=c
Realz Slaw 2012年

1

有什么方法可以确定ad <cb而不必执行[昂贵]乘法

当然。

想法:逐位比较十进制扩展。

唯一令人讨厌的一点是,我们必须首先排除平等,因为否则我们可能不会终止。
首先比较整数部分很有用,因为这很容易。

考虑一下:

def less( (a,b), (c,d) ) = {
  // Compare integer parts first
  intA = a div b
  intC = c div d

  if intA < intB
    return True
  else if intA > intB
    return False
  else // intA == intB
    // Normalize to a number in [0,1]
    a = a mod b
    c = c mod d

    // Check for equality by reducing both
    // fractions to lowest terms
    (a,b) = lowestTerms(a,b)
    (c,d) = lowestTerms(c,d)

    if a == c and b == d
      return False
    else
      do
        // Compute next digits in decimal fraction 
        a = 10 * a
        c = 10 * c

        intA = a div b
        intC = c div d

        // Remove integer part again
        a = a mod b
        c = c mod d
      while intA == intC

      return intA < intC
    end
  end
}

注意,do-while循环必须终止,因为数字不相等。但是,我们不知道它运行了多长时间。如果数字非常接近,则可能需要一段时间。

显然,没有昂贵的乘法。我们唯一需要的就是将提名人乘以。特别是,我们避免了显式计算 和。10adcb

这样快吗?可能不会。有很多整数除法,模和gdcs可以计算,并且我们有一个循环,其迭代次数与我们比较的数字之间的距离成反比。


辅助方法:

def lowestTerms(a,b) = {
  d = gcd(a,b)
  if d == 1
    return (a,b)
  else
    return lowestTerms(a div d, b div d)
  end
}

我认为这不是问题的实质。从开始就计算和已经花费了与计算问题中的和一样多的时间,并且该问题已经说“没有...乘法(或除法),和 “。它还基于您对循环运行了一段时间的评论,要求使用线性时间算法,我猜这不是。ç / d 一个d b Ç 一个d Ç ba/bc/dadbcadcb
David Richerby

@DavidRicherby嗯。我主要是在考虑溢出-在这里,操作不太可能产生大量数据。
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.