Сравнение рациональных чисел

12

Учитывая и ,a,b,c,dNb,d{0}

ab<cdad<cb

Мои вопросы:

Учитываяa,b,c,d

  1. Предполагая, что мы можем решить в , есть ли способ решить без предварительного умножения (или деления), и . Или есть какое-то доказательство того, что нет пути.x<yZO(|x|+|y|)ad<cbadcb
  2. Существует ли более быстрый способ сравнения рациональных чисел, чем умножение знаменателей.
Реал Слав
источник
1
@PKG, но умножение займет больше, чем линейное время. Я думаю, что мы хотим что-то быстрее по этому вопросу.
Джо
1
Сложный случай, когда один интервал содержит другой, например . [a,d][b,c]
PKG
1
Вы подразумеваете, что и имеют один и тот же знак. В противном случае направление неравенства изменится. дbd
Ран Г.
1
(1) Умножение почти линейно (ищите алгоритм Фюрера). (2) «Рациональное целое число», по крайней мере, в контексте теории алгебраических чисел, на самом деле просто означает целое число. Вы хотите сказать «рациональное» или «рациональное число».
Юваль Фильмус
1
см. также очевидный дубликат Как сравнить рациональные числа?
13

Ответы:

5

Мое текущее исследование:

Начальная попытка некоторых общих правил

Можно попытаться составить несколько общих правил для решения рационального сравнения:

Предполагая все положительные :a,b,c,d

a<bcdab<cd
Это в основном означает, что если левая сторона меньше единицы, а правая сторона хотя бы одна, левая сторона меньше правой боковая сторона. В том же духе:

abcdabcd

Еще одно правило:

(b>d)(ac)[ab<cd]
Я считаю это правило логичным, поскольку чем больше знаменатель, тем меньше число, тем больше числитель, тем больше число. Следовательно, если левая сторона имеет больший знаменатель и меньший числитель, левая сторона будет меньше.

С этого момента мы будем предполагать, что , потому что в противном случае мы можем либо решить его с помощью приведенных выше правил, либо изменить вопрос на , и мы все получим это условие.a<cb<dcd<?ab

Правила : This Правило в основном гласит, что вы всегда можете вычесть числители из знаменателей и установить результаты в качестве числителей, чтобы получить эквивалентную задачу. Я опущу доказательства.

(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<?bca d ? < b c b c ? < a d a d b cad=?bcad<?bcbc<?adadbc

Теперь была открытой проблемой, по крайней мере, в 1986 году:ad=?c

Сложность умножения и деления. Начнем с очень простого уравнения ax = b. При рассмотрении над целыми числами проверка его разрешимости и поиск решения x возможны путем целочисленного деления с остатком ноль. Для проверки заданного решения x будет достаточно целочисленного умножения, но это интересная открытая проблема, существуют ли более быстрые методы проверки.

- ARNOLD SCHÖNHAGE в решении уравнений с точки зрения вычислительной сложности

Очень интересно, что он также упомянул вопрос о проверке умножения матриц :

Также интересен вопрос, может ли проверка умножения матриц, т. Е. Проверка того, AB = G для данного C, возможна быстрее.

- ARNOLD SCHÖNHAGE в решении уравнений с точки зрения вычислительной сложности

С тех пор это было решено, и действительно можно проверить в время с помощью рандомизированного алгоритма (с являющимся размером входных матриц, так что это в основном линейное время в размер входа). Интересно, возможно ли свести целочисленное умножение к умножению матриц, особенно с их сходствами, учитывая сходство целочисленного умножения Карацубы с алгоритмами умножения матриц, которые последовали. Тогда, возможно, каким-то образом мы можем использовать алгоритм проверки матричного умножения для целочисленного умножения.n × nO(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

Вот очень частичная попытка опровержения. Предположим, что мы можем использовать только (постоянное количество) сложений и вычитаний в нашем решении, а также постоянное число заранее определенным числам. Другими словами, мы можем сделать постоянное число , и т. Д. В нашем решателе. Тогда единственные величины, которые мы можем вычислить, имеют вид где - это предопределенные константы. Обратите внимание, что может быть вычислено за время .modmod 2mod 3q=k1a+k2b+k3c+k4d=kiakqO(|a|)

Отредактированный Этот решающий элемент предназначен для определения бита если . Подумайте о том, чтобы взять качестве точек в . Бит определяется его положением относительно поверхности которая представляет собой гиперболоид в четырех измерениях. Если у нас есть точка во входном пространстве, вышеприведенное решение может вычислить точки на ограниченном расстоянии от этой входной точки, то есть эти точки т. д. Это определяет кубоид в 4-мерном пространстве.a d > b c a , b , c , d R 4 B a d = b c ( a , b , c , d ) q : | q - a | = k 1 ,B:B=1ad>bca,b,c,dR4Bad=bc(a,b,c,d)q:|qa|=k1,

(Как это сделать более точно?) Расстояние от кубоида до поверхности, как правило, не ограничено, и, следовательно, поверхность не может быть вычислена решающим устройством.

PKG
источник
Извините, я не ответил на это. Я думаю, что это может быть просто выше моего понимания, и я тем временем занимался поиском возможных ответов.
Реал Слав
1

Хороший вопрос. Вы бы приняли уровень доверия?

Возможно сделать приблизительное деление. Т.е.

Чтобы вычислить ограничивающие приблизительные коэффициенты a / b, сдвиньте вправо a на ceil (log_2 (b)), а также на этаж (log_2 (b)). Тогда мы знаем, что точное отношение находится между этими двумя значениями.

Затем, в зависимости от относительных размеров четырех целых чисел, можно исключить определенные случаи и получить 100% достоверность.

Можно повторить процедуру для radix, отличную от 2, и путем последовательности таких операций повысить уровень достоверности, пока не будет каким-либо образом наблюдаться смена знака / тай-брейка?

Это мой первый набросок метода.

Крис Стрингфеллоу
источник
Если вы посмотрите на мой ответ «текущего исследования», я думаю, что эти правила что-то делают для этого. Вы можете продолжать идти, много раз получая 100% уверенность, если оно попадает в одно из первых правил, а в худшем случае вы продолжаете повторять последние правила снова и снова, удаляя немного каждый раунд, как я полагаю, как вы предлагаете. Тем не менее, мой вопрос касается чего-то определенного в (точнее, лучше, чем умножение, также удовлетворит этот вопрос) или, по крайней мере, в рандомизированном алгоритме с некоторой экспоненциально малой вероятностью неудачи. O ( n log n )O(n)O(nlogn)
Реал Слав
Кроме того, если кто-то может проверить, что это открытая проблема, и не является чем-то более сложным, чем проверка (см. Мой ответ «текущее исследование», раздел « Открытая проблема» ), или если есть какие-то другие интересные исследования или результаты об этом, то это тоже может быть приемлемым ответом. ab=c
Реал Слав
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
}
Рафаэль
источник
Я не думаю, что это в духе вопроса. Вычисление и в самом начале уже занимает столько же времени, сколько вычисление и в вопросе, и вопрос уже говорит: «без ... умножения (или деления), и ". Он также запрашивает алгоритм линейного времени, который, я думаю, это не так, на основании вашего комментария о цикле, работающем некоторое время. c / d a d b c a d c ba/bc/dadbcadcb
Дэвид Ричерби
@DavidRicherby Хм. Я думал в основном о переполнениях - здесь операции с меньшей вероятностью будут создавать огромные числа.
Рафаэль