Фактор множника над кінцевим полем або цілими числами


20

Не використовуючи ніяких вбудованих факторингових / поліноміальних функцій, розподіліть поліном повністю на невідтворювані над цілими чи кінцевими полями.

Вхідні дані

Ваша програма / функція отримає деякий простий (або нульовий) номер у nякості входу. Поле / кільце - це кінцеве поле цього порядку (тобто Z/nZ) або просто, Zякщо nє 0. Ваша програма може вийти з ладу, якщо nце не так 0чи просто. Поліном буде в F[x].

Ваша програма / функція також отримає поліном як вхід.

У введенні є деяка гнучкість, обов'язково вкажіть, як ви маєте намір отримати вхід. Наприклад, поліном може бути введений як перелік коефіцієнтів, або у формі, яку очікують більшість людей (наприклад:) 50x^3 + x^2, або в якійсь іншій розумній формі. Або формат введення поля / кільця також може бути різним.

Вихідні дані

Ваша програма / функція виведе поліном, який враховується повністю. Ви можете залишити кілька коренів розширеними (тобто (x + 1)(x + 1)замість (x + 1)^2). Ви можете видалити пробіл між бінарними операторами. Ви можете замінити протиставлення *. Ви можете вставити пробіли в дивних місцях. Ви можете змінити порядок чинників у будь-який порядок. xТермін може бути просто (x). xможна записати як x^1; однак постійний термін може не мати x^0. Сторонні +ознаки допустимі. У вас може бути термін з 0передньою частиною, вони повинні бути залишені. Провідний термін кожного фактора повинен бути позитивним, негативні ознаки повинні бути зовні.

Тестові випадки, ваша програма повинна мати можливість виробляти вихід для кожного з них у розумний час (скажімо, <= 2 години):

Вхід: 2, x^3 + x^2 + x + 1

Вихід: (x + 1)^3

Вхід: 0, x^3 + x^2 + x + 1

Вихід: (x + 1)(x^2 + 1)

Вхід: 0, 6x^4 – 11x^3 + 8x^2 – 33x – 30

Вихід: (3x + 2)(2x - 5)(x^2 + 3)

Вхід: 5, x^4 + 4x^3 + 4x^2 + x

Вихід: x(x + 4)(x + 4)(x + 1)

Вхід: 0, x^5 + 5x^3 + x^2 + 4x + 1

Вихід: (x^3 + 4x + 1)(x^2 + 1)

Особлива подяка Пітеру Тейлору за критику моїх тестових справ


1
Я думаю, що це дає мені зворотній зв язок із більш важкою математикою для студентів . Я навіть тут пряму в правильному напрямку?
Цифрова травма

1
Це нагадує мені час, коли у мене були кошмари, намагаючись правильно надрукувати поліноми ...
Sp3000

Вибачте, що я не зрозумів, але що потрібно зробити перший номер введення? або як це впливає на вихід?
Оптимізатор

@Optimizer Перше вхідне число визначає, яке поле / цілі числа ви працюєте. Якщо число не нульове, ви працюєте над кінцевим полем цього порядку. Кінцеве поле порядку pмає елементи, {0, 1, ... , p-1}і воно знаходиться в режимі додавання / множення p. В основному, зменшіть будь-який коефіцієнт на мод, pі ви добре. Також зауважте, що якщо він має корінь, тобто лінійний коефіцієнт, один з {0, ... , p-1}буде виробляти 0(mod p), коли він підключений до многочлена.
Джастін

1
@flawr, стандартним підходом до розбиття Zфакторів є переоцінка Z/pZна відповідний, pа потім на підйом Хензеля. Тим не менш, підхід із гольфу, мабуть, (і це, безумовно, маршрут, на який я дивлюся), щоб використовувати простий обмежений на висоту чинників і грубу силу.
Пітер Тейлор

Відповіді:


17

GolfScript (222 байти)

~.@:q@.0\{abs+}/2@,2/)?*or:^{\1$^base{^q- 2/-}%.0=1=1$0=q>+{{:D[1$.,2$,-)0:e;{.0=0D=%e|:e;(D(@\/:x@@[{x*~)}%\]zip{{+}*q!!{q%}*}%}*e+])0-{;0}{@;@\D.}if}do}*;\).^3$,)2/?<}do;][[1]]-{'('\.,:x;{.`'+'\+'x^'x(:x+x!!*+\!!*}%')'}/

Демонстрація в Інтернеті

Примітки

  1. Формат введення nсупроводжується масивом коефіцієнтів GolfScript від найбільшого до найменш значущого. Наприклад, 0, x^5 + 5x^3 + x^2 + 4x + 1слід відформатувати як 0 [1 0 5 1 4 1].
  2. Над кінцевим полем є лише кінцево багато поліномів досить малого ступеня, щоб бути актуальними. Однак це не закінчилося Z. Я Zвпораюся, використовуючи розслаблену форму висоти Міньотт. Чудовим документом про межі висоти у факторингу є « Bounds on Factors in Z [x] , John Abbott, 2009 (посилання на переддрук arxiv; його резюме говорить, що це було прийнято Журналом символічних обчислень ). Найбільш розслаблена форма, що надається там, з точки зору норми L-2, але для економії байтів я розслаблююсь далі і використовую замість неї норму L-1. Тоді це справа жорстокого примусу шляхом судового підрозділу.
  3. У межах кінцевого поля кожен многочлен є постійним часом монічним многочленом, тому я роблю пробний поділ лише на монічні поліноми і зберігаю зворотну реакцію в полі. Однак Zце лише кільце, і тому необхідно зробити пробний поділ за немоніальними факторами-кандидатами. Мені вдається позбутися невтілення раціональних чисел, провівши тест поділу провідних факторів і накопичивши прапор "помилки" e.
  4. З пунктів 2 і 3 випливає, що випадок факторингу, Zяк правило, повільніше, і його неможливо перевірити за допомогою демонстрації в Інтернеті. Однак найповільніший з офіційних тестових випадків займає 10 хвилин, що цілком в межах "розумного" терміну.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.