有理数の比較


12

所与及び、a,b,c,d∈Nb,d∉{0}

ab<cd⟺ad<cb

私の質問は:

与えられa,b,c,d

  1. 我々は決定することができると仮定すると、における、決定するどのような方法がある乗算(または分割)、プリフォームすることなくおよび。または、方法がないという何らかの証拠があります。x<y∈ZO(|x|+|y|)ad<cba⋅dc⋅b
  2. 分母を乗算するよりも有理数を比較するための高速な方法はありますか。

1
@PKGしかし、乗算は線形時間以上かかります。私たちはこの質問に対してもっと速くしたいと思います。
— ジョー

1
トリッキーなケースは、ある間隔に別の間隔が含まれている場合です(例:。[a,d]⊂[b,c]
— PKG

1
とが同じ符号を持っていると暗黙的に仮定します。そうでない場合、不等式の方向が変わります。dbd
— ランG.

1
(1)乗算はほぼ線形です(Fürerのアルゴリズムを検索)。(2)「有理数整数」は、少なくとも代数的数論の文脈では、実際には整数を意味します。「有理数」または「有理数」と言いたいです。
— ユヴァルフィルム

回答:


5

私の現在の研究:

いくつかの一般的なルールの最初の試み

合理的な比較を解決するためのいくつかの一般的なルールを作成しようとすることができます:

すべての正の想定:a、b、c、d

a<b∧c≥d⟹ab<cd
これは基本的に、左側が1未満で、右側が少なくとも1であれば、左側が右側よりも小さいことを意味します。同じように:

a≥b∧c≤d⟹ab≮cd

別のルール:

分母が大きいほど数値は小さくなり、分子が大きいほど数値は大きくなるため、このルールは論理的であると考えています。左側が大きい分母有する場合したがって及び小さな分子を、左が小さくなります。

(b>d)∧(a≤c)⇒[ab<cd]

ここでは上から、我々はそれを前提とします< C ∧ B < dはそうでない場合、我々はどちらか上記のルールでそれを解決する、またはに質問を逆にすることができますので、Ca<c∧b<d、とにかくこの状態になります。cd<?ab

ルール:

(b−a)b<(d−c)d⟺[ab<cd]|a<c、b<d
このルールは基本的に、分母から分子を常に減算し、結果を分子として設定して、同等の問題を取得できることを示しています。証拠は省略します。

ab<c−ad−b⟺[ab<cd]|a<c、b<d

このルールを使用すると、同等の問題について、右の分子と分母から左の分子と分母を減算できます。

そしてもちろん、スケーリングがあります:

akbk<cd⟺[ab<cd]|a<c、b<d
スケーリングを使用して、上記の減算規則をより重要にすることができます。

これらのルールを使用すると、物事をいじったり、スマートな組み合わせで繰り返し適用したりできますが、数字が近く、病的である場合があります。

:前の規則を適用することにより、あなたはにすべてのこれらの問題を軽減することができ 、A

ab<ap+qbp′+q′⟺ab<qq′|a>q、b>q′

これを今すぐ直接解決できる場合もあれば、そうでない場合もあります。病理学的症例は通常、次の形式です。

ab<cd|a>c、b>d、c∈O(a)、d∈O(b)

それから、あなたはそれをひっくり返して、同じことをもたらします、ほんの少しだけ。ルール+フリップを適用するたびに、数字/ビットが削減されます。AFAICT、病理学的なケースでルールを回(各桁/ビットに1回)適用し、その見かけ上の利点を否定しない限り、すぐに解決することはできません。O(n)

未解決の問題??

この問題は、現在の未解決の問題よりも難しいように思えます。

さらに弱い問題は、以下を判別することです。

ad=?bc

そしてさらに弱い:

ad=?c

これは、乗算を検証する際の未解決の問題です。dを決定方法があれば、それはより弱いです。< b cの場合、簡単にa dを決定できますか?= b c、アルゴリズムを2回使用してテストすることにより、a d ?< b c、b c ?< a d。どちらかが真の場合、a d ≠ b cであることがわかります。ad<?bcad=?bcad<?bcbc<?adad≠bc

さて、D ?= cは、少なくとも1986年には未解決の問題でした。ad=?c

乗算と除算の複雑さ。非常に単純な方程式ax = bから始めましょう。整数を考慮した場合、その可解性のテストと解xの検出は、剰余ゼロの整数除算によって可能です。与えられた解xをチェックするには整数の乗算で十分ですが、検証のより速い方法があるかどうかは興味深い未解決の問題です。

― 計算の複雑さの観点から方程式を解くアーノルド・シェーンヘージ

非常に興味深いことに、彼は行列乗算を検証する問題にも言及しました。

また、行列乗算の検証、つまり、与えられたCに対してAB = Gであるかどうかの確認が、おそらくより高速に実行できるかどうかは興味深い質問です。

― 計算の複雑さの観点から方程式を解くアーノルド・シェーンヘージ

これは解決されており、ランダム化アルゴリズムを使用して時間で検証することが実際に可能です(入力行列のサイズはn × nなので、基本的には入力のサイズは線形時間です) )。特にその後の行列乗算アルゴリズムに対する唐津整数乗算の類似性を考えると、整数乗算を行列乗算に減らすことは可能でしょうか。次に、おそらく何らかの方法で、整数乗算に行列乗算検証アルゴリズムを活用できます。O(n2)n×n

とにかく、これはまだ私の知る限り、未解決の問題でありより強力な問題ですか?< c dは確実に開いています。平等検証の問題を解決することが、比較不平等の検証の問題に何らかの関係があるのか​​どうか、私は興味があります。ad<?cd

私たちの問題のわずかな変化は、分数が最低項に減少することが保証される場合です。この場合は。これは、分数の減少の比較検証に関係がありますか?ab=?cd

さらに微妙な質問、dをテスト方法があったらどうでしょうか?< c、これはdのテストにまで拡張されますか?= c?私は、我々が行ったようにあなたは、この「両方の方法」を使用することができますどのように表示されていないD ?< c d。ad<?cad=?cad<?cd

関連:

  • 有限オートマトンによる非正規言語の近似認識

    彼らは、おおよその乗算とランダム化検証についていくつかの作業を行いますが、これは完全には理解できません。

  • math.SE:乗算せずに2つの乗算を比較する方法
  • 我々は前処理させたと仮定し我々は解決することができ、我々は多項式時間で欲しかったな限り、B = Cを線形時間で?cab=c
  • 線形時間非決定論的整数乗算アルゴリズムはありますか?http://compgroups.net/comp.theory/nondeterministic-linear-time-multiplication/1129399を参照してください

    O(n log(n)log(log(n)))複雑さのようなものでnビット数を乗算するためのよく知られたアルゴリズムがあります。また、少なくとも入力全体を確認する必要があるため、O(n)よりも良いことはできません。私の質問は、「非決定的」アルゴリズムの適切なクラスのO(n)に実際に到達できるかどうかです。

    より正確には、2つのnビット2進数「a」と「b」および2nビット数「c」を受け​​入れ、「a * b = c」かどうかをO(n)時間で通知​​できるアルゴリズムがありますか?そうでない場合、アルゴリズムがそれを使用して線形時間で製品をテストできるように、証明書C(a、b、c)の他の形式がありますか?線形時間でない場合、製品のテストの問題は、計算よりも少なくとも漸近的に簡単ですか?これらの方針に沿った既知の結果は歓迎されます。

    ジョン。

    ―johnh4717


1

これは、非常に部分的な反証の試みです。事前に決められた wrtの定数と同様に、ディサイダーで(一定の数の)加算と減算だけを使用できると仮定します。言い換えると、ディサイザーでm o d 2、m o d 3などの定数を実行できます。計算できる量は、q = k 1 a + k 2 b + k 3 c + k 4 d = ∑ kの形式のみです。modmod 2mod 3ここで、 kは事前定義された定数です。qは時間 O (∑ | a |)で計算できることに注意してください。q=k1a+k2b+k3c+k4d=∑k私akqO(∑|a|)

編集 この決定者は、ビットを決定することを意図しています:B = 1 iff a d > b c。服用検討、B 、C 、Dの内点としてR 4。ビットBは、4次元の双曲面である表面a d = b cの位置によって決まります。点(a 、b 、c 、d )がある場合B:B=1ad>bca、b、c、dR4Bad=bc(a、b、c、d)入力空間では、上記の決定者は、この入力ポイントの境界距離内のポイント、つまりこれらのポイントを計算できます。q − a | = K 1、等これは、4次元空間内の直方体を定義します。q:|q−a|=k1、

(これをより正確にする方法は?)直方体から表面までの距離は一般に制限されていないため、決定者が表面を計算することはできません。


すみません、私はこれに反応しませんでした。これは単に私の理解を超えているのではないかと思います。その間、可能な答えを自分で研究するのに忙しかったです。
— リアルツスロー

1

良い質問。自信のレベルを受け入れますか?

おそらくおおよその除算を行います。すなわち

a / bの境界近似商を計算するには、ceil(log_2(b))およびfloor(log_2(b))でaを右にシフトします。次に、正確な商がこれら2つの値の間にあることがわかります。

次に、4つの整数の相対的なサイズに応じて、特定のケースを除外し、100%の信頼を得ることができます。

2以外の基数について手順を繰り返すことができます。このような操作を連続して行うと、符号/タイブレークの変化が何らかの形で観察されるまで、信頼度が上がりますか?

これがメソッドの最初のドラフトスケッチです。


O(n)O(nlog⁡n)

ab=c

1

[高価な]乗算を実行せずにad <cbを決定する方法はありますか

承知しました。

アイデア:ビットごとに10進展開を比較します。

唯一の厄介な点は、最初に平等を除外する必要があることです。そうしないと、終了しない可能性があります。
最初に整数部分を比較すると便利です。

このことを考慮:

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

これは速いですか?おそらくない。gdc計算する整数除算、モジュロ、およびs がたくさんあり、反復回数が比較す​​る数値間の距離に反比例するループがあります。


ヘルパーメソッド:

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

a/bc/dadbc 質問で、そして質問はすでに「なしで...乗算(または除算)、 a⋅d そして c⋅b「。また、線形時間アルゴリズムを要求しますが、これはしばらくの間実行されているループについてのコメントに基づいていると思われます。
— David Richerby

@DavidRicherby Hm。私は主にオーバーフローについて考えていました-ここでは、操作によって膨大な数が作成される可能性は低くなります。
— ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.