Rationale Zahlen vergleichen


12

Gegeben a,b,c,dN und b,d{0} ,

ab<cdad<cb

Meine Fragen sind:

Gegeben a,b,c,d

  1. Angenommen, wir können in , gibt es eine Möglichkeit, zu bestimmen, ohne die Multiplikationen (oder Divisionen), und . Oder gibt es einen Beweis dafür, dass es keinen Weg gibt?x<yZO(|x|+|y|)ad<cbadcb
  2. Gibt es eine schnellere Methode, um rationale Zahlen zu vergleichen, als die Nenner zu multiplizieren?

1
@PKG, aber die Multiplikation dauert länger als linear. Ich denke, wir wollen etwas schneller für diese Frage.
Joe

1
Der schwierige Fall ist, wenn ein Intervall ein anderes enthält, z. B. . [a,d][b,c]
PKG

1
Sie nehmen implizit an, dass und d dasselbe Vorzeichen haben. Ansonsten ändert sich die Ungleichungsrichtung. bd
Ran G.

1
(1) Die Multiplikation verläuft nahezu linear (Suche nach Fürers Algorithmus). (2) Eine "rationale ganze Zahl" bedeutet, zumindest im Kontext der algebraischen Zahlentheorie, eigentlich nur eine ganze Zahl. Sie möchten "rational" oder "rational number" sagen.
Yuval Filmus

1
siehe auch scheinbares Duplikat Wie vergleiche
VZN

Antworten:


5

Meine aktuelle Forschung:

Erster Versuch mit einigen allgemeinen Regeln

Man kann versuchen, einige allgemeine Regeln für die Lösung des rationalen Vergleichs aufzustellen:

Angenommen, alle positiven :a,b,c,d

a<bcdab<cd
Dies bedeutet im Grunde, wenn die linke Seite kleiner als eins ist und die rechte Seite mindestens eins ist, ist die linke Seite kleiner als die rechte Seite. In der gleichen Richtung:

abcdabcd

Eine andere Regel:

Ich halte diese Regel für logisch, denn je größer der Nenner, desto kleiner die Zahl, und je größer der Zähler, desto größer die Zahl. Wenn also die linke Seite einen größeren Nennerundeinen kleineren Zähler hat, ist die linke Seite kleiner.

(b>d)(ac)[ab<cd]

Ab jetzt nehmen wir an, dass , da wir es sonst entweder mit den obigen Regeln lösen oder die Frage in c umkehren könnena<cb<d , und wir haben sowieso diese Bedingung.cd<?ab

Regeln :

(ba)b<(dc)d[ab<cd]|a<c,b<d
Diese Regel besagt grundsätzlich, dass Sie die Zähler immer von den Nennern abziehen und die Ergebnisse als Zähler festlegen können, um ein gleichwertiges Problem zu erhalten. Ich werde den Beweis weglassen.

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

Mit dieser Regel können Sie den linken Zähler und Nenner vom rechten Zähler und Nenner für ein gleichwertiges Problem abziehen.

Und natürlich gibt es Skalierung:

akbk<cd[ab<cd]|a<c,b<d
Sie können die Skalierung verwenden, um die obigen Subtraktionsregeln signifikanter zu machen.

Mithilfe dieser Regeln können Sie mit Dingen herumspielen, sie wiederholt in intelligenten Kombinationen anwenden, aber es gibt Fälle, in denen Zahlen nahe beieinander liegen und pathologisch sind.

Durch Anwenden der vorherigen Regeln können Sie all diese Probleme auf Folgendes reduzieren: a

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

Manchmal kann man das jetzt direkt lösen, manchmal nicht. Die pathologischen Fälle sind in der Regel in der Form:

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

Dann drehen Sie es um und erhalten dasselbe Ergebnis, nur mit einem bisschen weniger. Jede Anwendung der Regeln + Flip reduziert sie um eine Ziffer / Bit. AFAICT, Sie können es nicht schnell lösen, es sei denn, Sie wenden die Regeln mal (einmal für jede Ziffer / Bit) im pathologischen Fall an und negieren ihren scheinbaren Vorteil.O(n)

Offenes Problem?

Mir wurde klar, dass dieses Problem schwieriger zu sein scheint als einige derzeit offene Probleme.

Ein noch schwächeres Problem besteht darin, festzustellen:

ad=?bc

Und doch schwächer:

ad=?c

Dies ist das offene Problem der Überprüfung der Multiplikation . Es ist schwächer, denn wenn du einen Weg hättest, zu bestimmen ? < b c , dann können Sie leicht ein d bestimmen ? = b c , durch zweimaliges Testen mit dem Algorithmus, a d ? < b c , b c ? < a d . Wenn beides zutrifft, wissen Sie, dass a d b c .ad<?bcad=?bcad<?bcbc<?adadbc

Nun, war zumindest 1986 ein offenes Problem:ad=?c

Die Komplexität von Multiplikation und Division. Beginnen wir mit der sehr einfachen Gleichung ax = b. Über die ganzen Zahlen betrachtet ist es möglich, die Lösbarkeit zu testen und eine Lösung x durch ganzzahlige Division mit dem Rest Null zu finden. Für die Überprüfung einer gegebenen Lösung x reicht die ganzzahlige Multiplikation aus, aber es ist ein interessantes offenes Problem, ob es schnellere Überprüfungsmethoden gibt.

- ARNOLD SCHÖNHAGE beim Lösen von Gleichungen in Bezug auf die Komplexität von Rechnern

Sehr interessanterweise erwähnte er auch die Frage der Überprüfung der Matrixmultiplikation :

Es ist auch eine interessante Frage, ob die Überprüfung der Matrixmultiplikation, dh die Überprüfung, ob für gegebenes C AB = G ist, möglicherweise schneller durchgeführt werden könnte.

- ARNOLD SCHÖNHAGE beim Lösen von Gleichungen in Bezug auf die Komplexität von Rechnern

Dies ist seitdem gelöst worden, und es ist tatsächlich möglich, in -Zeit mit einem zufälligen Algorithmus zu verifizieren (wobei n × n die Größe der Eingabematrizen ist, so dass es sich im Grunde genommen um eine lineare Zeit in der Größe der Eingabe handelt ). Ich frage mich, ob es möglich ist, die Ganzzahlmultiplikation auf die Matrixmultiplikation zu reduzieren, insbesondere aufgrund ihrer Ähnlichkeiten, da die Ganzzahlmultiplikation von Karatsuba Ähnlichkeiten mit den nachfolgenden Matrixmultiplikationsalgorithmen aufweist. Dann können wir vielleicht auf irgendeine Weise den Matrixmultiplikations-Verifizierungsalgorithmus für die ganzzahlige Multiplikation nutzen.O(n2)n×n

Wie auch immer, da dies meines Wissens immer noch ein offenes Problem ist, das stärkere Problem ist sicherlich offen. Ich bin gespannt, ob die Lösung des Problems der Überprüfung der Gleichheit einen Einfluss auf das Problem der Überprüfung der Vergleichsungleichheit hat.ad<?cd

Eine geringfügige Abweichung von unserem Problem wäre, wenn die Brüche garantiert auf die niedrigsten Werte reduziert werden; In diesem Fall ist es leicht zu erkennen, ob . Kann dies einen Einfluss auf die Vergleichsprüfung für reduzierte Brüche haben?ab=?cd

Eine noch subtilere Frage: Was wäre, wenn wir einen Weg hätten, zu testen ? < c , würde sich dies auf das Testen eines d erstrecken ? = c ? Ich verstehe nicht, wie Sie diese "beiden Möglichkeiten" nutzen können, wie wir es für ein d getan haben ? < c d .ad<?cad=?cad<?cd

Verbunden:

  • Ungefähre Erkennung von nicht regulären Sprachen durch endliche Automaten

    Sie arbeiten an der ungefähren Multiplikation und der randomisierten Verifikation, die ich nicht vollständig verstehe.

  • math.SE: Wie kann man zwei Multiplikationen ohne Multiplikation vergleichen?
  • Angenommen, wir durften in der Polynomzeit so weit vorverarbeiten, wie wir wollten. Können wir a b = c in linearer Zeit lösen ?cab=c
  • Gibt es einen linearen nichtdetermistischen Ganzzahl-Multiplikationsalgorithmus? Siehe http://compgroups.net/comp.theory/nondeterministic-linear-time-multiplication/1129399

    Es gibt bekannte Algorithmen zum Multiplizieren von n-Bit-Zahlen mit so etwas wie der Komplexität von O (n log (n) log (log (n)). Und wir können es nicht besser machen als O (n), weil wir uns zumindest die gesamten Eingaben ansehen müssen. Meine Frage ist: Können wir tatsächlich O (n) für eine geeignete Klasse von "nicht deterministischen" Algorithmen erreichen?

    Genauer gesagt, gibt es einen Algorithmus, der zwei n-Bit-Binärzahlen "a" und "b" und eine 2n-Bit-Zahl "c" akzeptieren und Ihnen in O (n) -Zeit mitteilen kann, ob "a * b = c" ist? Wenn nicht, gibt es eine andere Form von Zertifikat C (a, b, c), mit der ein Algorithmus das Produkt in linearer Zeit testen kann? Wenn nicht die lineare Zeit, ist es dann einfacher, das Produkt zumindest asymptotisch zu testen, als es zu berechnen? Alle bekannten Ergebnisse in dieser Richtung wären willkommen.

    John.

    ―Johnh4717


1

modmod 2mod 3q=k1a+k2b+k3c+k4d=kiakqO(|a|)

B:B=1ad>bca,b,c,dR4Bad=bc(a,b,c,d)q:|qa|=k1,

(Wie kann man das präzisieren?) Der Abstand vom Quader zur Oberfläche ist im Allgemeinen unbegrenzt, und daher kann die Oberfläche vom Entscheider nicht berechnet werden


Entschuldigung, ich habe darauf nicht geantwortet. Ich denke, das könnte einfach über meinem Verständnis liegen, und ich habe in der Zwischenzeit selbst nach möglichen Antworten gesucht.
Realz Slaw

1

Gute Frage. Würden Sie ein gewisses Maß an Vertrauen akzeptieren?

Vielleicht eine ungefähre Aufteilung machen. Dh

Um die ungefähren Grenzquotienten von a / b zu berechnen, verschieben Sie a nach rechts um ceil (log_2 (b)) und auch um floor (log_2 (b)). Dann wissen wir, dass der genaue Quotient zwischen diesen beiden Werten liegt.

Abhängig von der relativen Größe der vier Ganzzahlen kann man dann bestimmte Fälle ausschließen und 100% iges Vertrauen erhalten.

Man kann die Prozedur für radix anders als 2 wiederholen und durch eine Abfolge solcher Operationen das Vertrauensniveau erhöhen, bis ein Wechsel des Vorzeichens / Gleichstandes irgendwie beobachtet wird?

Das ist meine erste Skizze einer Methode.


Wenn Sie sich meine Antwort "Aktuelle Forschung" ansehen, denke ich, dass diese Regeln etwas in dieser Richtung bewirken. Sie können weitermachen und erhalten oft 100% iges Vertrauen, wenn eine der ersten Regeln eingehalten wird, und im schlimmsten Fall wiederholen Sie die letztgenannten Regeln immer wieder, indem Sie in jeder Runde ein Stückchen entfernen, ähnlich wie Sie es vorschlagen, denke ich. Meine Frage bezieht sich jedoch auf etwas Bestimmtes inÖ(n) (oder besser als Multiplikation, Ö(nLogn)würde auch diese Frage erfüllen) oder zumindest einen randomisierten Algorithmus mit einer exponentiell geringen Ausfallwahrscheinlichkeit.
Realz Slaw

Auch, wenn man überprüfen könnte, dass dies ein offenes Problem ist und nicht von Natur aus schwieriger als die Überprüfung einb=c(siehe meine "aktuelle Forschung" Antwort, Abschnitt Offenes Problem ?? ), oder wenn es irgendeine andere interessante vorhandene Forschung oder Resultate über dieses gibt, dann könnte das auch eine annehmbare Antwort sein.
Realz Slaw

1

Gibt es eine Möglichkeit, ad <cb zu bestimmen, ohne die [teuren] Multiplikationen durchführen zu müssen?

Sicher.

Idee: Vergleichen Sie die Dezimalerweiterung nach und nach.

Das einzig schlimme ist, dass wir zuerst die Gleichheit ausschließen müssen, da wir sonst möglicherweise nicht kündigen.
Es ist nützlich, zuerst die ganzzahligen Teile zu vergleichen, da dies einfach ist.

Bedenken Sie:

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
}

Notiere dass der do-while Schleife beendet werden muss, da die Zahlen ungleich sind. Wir wissen jedoch nicht, wie lange es dauert; Wenn die Zahlen sehr nahe sind, könnte es eine Weile dauern.

Natürlich gibt es keine teuren Multiplikationen; Wir müssen nur die Nominatoren mit multiplizieren10. Insbesondere haben wir das Rechnen vermieden eind und cb ausdrücklich.

Ist das schnell? Wahrscheinlich nicht. Es gibt viele ganzzahlige Divisionen, Module und gdcs zu berechnen, und wir haben eine Schleife, deren Anzahl der Iterationen umgekehrt proportional zum Abstand zwischen den Zahlen ist, die wir vergleichen.


Die Hilfsmethode:

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

Ich glaube nicht, dass dies im Sinne der Frage ist. Computingein/b und c/d Gleich zu Beginn kostet das schon so viel Zeit wie das Rechnen eind und bc in der Frage, und die Frage sagt bereits "ohne ... die Multiplikationen (oder Divisionen), eind und cb". Es wird auch nach einem linearen Zeitalgorithmus gefragt, was meiner Meinung nach nicht der
Fall

@DavidRicherby Hm. Ich habe hauptsächlich über Überläufe nachgedacht - hier ist es weniger wahrscheinlich, dass die Operationen große Zahlen erzeugen.
Raphael
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.