Моє поточне дослідження:
Початкова спроба деяких загальних правил
Можна спробувати скласти кілька загальних правил для вирішення раціонального порівняння:
Припустимо, що всі позитивні :a,b,c,d
a<b∧c≥d⟹ab<cd
Це в основному означає, якщо ліва сторона менше однієї, а права - щонайменше одна, ліва - менше правої сторона. У цьому ж ключі:
a≥b∧c≤d⟹ab≮cd
Ще одне правило:
(b>d)∧(a≤c)⇒[ab<cd]
Я вважаю це правило логічним, оскільки чим більший знаменник, тим менша кількість, а тим більша чисельник, тим більше число. Отже, якщо ліва сторона має більший знаменник
і менший числівник, ліва буде меншою.
Звідси далі, будемо вважати, що , тому що в іншому випадку ми можемо або вирішити це за допомогою наведених вище правил, або повернути питання до , і ми все одно закінчимо цю умову.a<c∧b<dcd<?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
Ви можна використовувати масштабування, щоб зробити вищезазначені правила віднімання.
Використовуючи ці правила, ви можете пограти з речами, застосувати їх неодноразово, у розумних поєднаннях, але бувають випадки, коли числа близькі та патологічні.
Застосовуючи попередні правила, ви можете зменшити всі ці проблеми до:
ab<ap+qbp′+q′⟺ab<qq′∣∣∣a>q,b>q′
Іноді це можна вирішити прямо зараз, іноді ні. Зазвичай патологічні випадки мають форму:
ab<cd∣∣a>c,b>d,c∈O(a),d∈O(b)
Потім ви перегортаєте його і отримуєте те саме, лише на один біт менше. Кожне застосування правил + flip зменшує його на цифру / біт. AFAICT, ви не можете швидко вирішити це, якщо ви не застосуєте правила разів (один раз на кожну цифру / біт) у патологічному випадку, не зважаючи на їх уявну перевагу.O(n)
Відкрита проблема ??
Я зрозумів, що ця проблема здається важче, ніж деякі поточні відкриті проблеми.
Ще слабшою проблемою є визначення:
ad=?bc
І ще слабкіше:
ad=?c
Це відкрита проблема перевірки множення . Вона слабша, бо якби у вас був спосіб визначити , то ви можете легко визначити , тестуючи за допомогою алгоритму двічі, , . Якщо це правда, ви знаєте, що .ad<?bcad=?bcad<?bcbc<?adad≠bc
Тепер, була відкритою проблемою, принаймні в 1986 році:ad=?c
Складність множення та ділення. Почнемо з дуже простого рівняння ax = b. Якщо розглядати цілі числа, перевірити його розв’язність та знайти рішення x можливо шляхом цілого поділу з залишковим нулем. Для перевірки заданого рішення x буде цілком множинне множення, але цікавою є відкрита проблема, чи існують більш швидкі методи перевірки.
- ARNOLD SCHÖNHAGE в розв’язуванні рівнянь з точки зору складності обчислень
Дуже цікаво, що він також згадав про питання перевірки матричного множення :
Цікавим є також питання, чи може перевірка множення матриці, тобто перевірка того, чи може АВ = G для даного С, можливо зробити швидше.
- ARNOLD SCHÖ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