Знайдіть залишок великого фіксованого многочлена при діленні на малий невідомий многочлен


9

Припустимо, що ми працюємо в кінцевому полі. Нам дається великий фіксований многочлен p (x) (скажімо, ступеня 1000) над цим полем. Цей многочлен заздалегідь відомий, і нам дозволяється робити обчислення, використовуючи багато ресурсів на "початковій фазі". Ці результати можуть зберігатися у досить невеликих оглядових таблицях.

В кінці "початкової фази" нам буде наданий невеликий невідомий многочлен q (x) (скажімо, ступеня 5 або менше).

Чи існує швидкий спосіб обчислити p (x) mod q (x), враховуючи, що нам дозволяється робити кілька складних обчислень на "початковій фазі"? Один очевидний спосіб - обчислити p (x) mod q (x) для всіх можливих значень q (x). Чи є кращий спосіб зробити це?

Відповіді:


3

Наступні алгоритми добре працюють, якщо в нижньому полі є дуже малий порядок s .

Припустимо, ми знаємо, що є невідворотним, фіксованим ступенем . Тоді, mod , ми знаємо, що виконується. Отже, достатньо попередньо обчислити .qdqxsd=xp(x)modxsdx

Загалом, може розкластись на добуток многочленів . У цьому випадку аналогічний аргумент застосовується до обчислення кожного окремо, а потім результатів. Тому нам дійсно потрібно обчислити для кожного .q(x)q=q1qrpq1,,qrp(x)modxsdxdd


2

Я думаю, що існує досить швидкий спосіб зробити це. Нехай коефіцієнти ще невідомого многочлена є , тому де - невелике число. Тепер почнемо обчислювати де , де великий і відомі. Це ми робимо, зменшуючи ступінь, використовуючи рівності як . Врешті-решт ми отримаємо поліном градуса , коефіцієнти якого є поліномами (оскількиqbiq=i=0dbixidp(modq)p=i=0DaixiDaiaDxD=aDbdi=1d1bdixDi<d1biaiвідомі). Ці многочлени ми можемо швидко обчислити, коли отримаємо .q


-1

Дивіться чудові коментарі до цієї публікації нижче. :)


Попередня обробка; вхід: p(x)

  1. Фактор як .p(x)p(x)=i=01000(xiri)

  2. Збережіть це як таблицю різних коренів та їх відповідної кратності .Trjmj

Інтернет-фаза; вхід: q(x)

  1. Фактор як .q(x)q(x)=i=05(xiri)

  2. Зберігайте це як список різних корінців та їх відповідної кратності .Lrjmj

  3. У той час як не пустили, видалити наступний корінь / кратність з і будь-яка точка , як в .LLT

  4. Зніміть з модифікованої таблиці і виведіть.p(x)modq(x)T


Інші коментарі:

  • Очевидно, ви хочете сортувати таблицю і отримати доступ до неї за допомогою двійкового пошуку (або дерева).T
  • (Нехай - ступінь .) Якщо ви хочете, щоб результат був у представленні коефіцієнтів, ви можете просто зробити купу FFT в кінці, щоб отримати час.dp(x)p(x)modq(x)O~(d)
  • Залежно від того, як ви формалізуєте це, ви, ймовірно, можете заздалегідь обчислити безліч різноманітних способів, за допомогою яких ви заздалегідь би рекомбінували терміни в (стиль динамічного програмування), так що більшість (або всі) множень - це лише пошуки. Домінуюча вартість - це кількість перевірок, або приблизно . Якщо , це лише жменька конкретних, арифметичних операцій.TO(logd)d=1000

2
На яке поле ви вказуєте p? Наскільки великим ви вважаєте, що таке представлення буде щодо початкового поля? А коли ви скажете прочитати з модифікованої таблиці та вивести, що ви маєте на увазі?
Девід Еппштейн

2
Це працює лише в тому випадку, якщо ви працюєте над полем, де розділяються і і . Але це, здається, залежить від ; зокрема, ви не можете попередньо обчислити корені лише для . Крім того, обчислення коренів над таким великим полем потребуватиме часу (принаймні); це не краще, ніж наївний алгоритм. pqqpq|p|
Девід Харріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.