Обертати Коріння


11

Враховуючи ненульовий многочлен з цілими коефіцієнтами та коренями, що знаходяться на уявній і на дійсній прямій, так що якщо aє коренем, то так і є -a, поверніть інший многочлен з коренями, повернутими на 90 градусів.

Деталі

Поліном може бути заданий у будь-якому розумному форматі, наприклад у вигляді списку коефіцієнтів. Умова симетрії, яка aє коренем тоді і тільки тоді, якщо -aкорінь теж примушує повернутий многочлен, щоб мати і реальні цілісні коефіцієнти.

Приклади

Далі многочлени подаються у вигляді списку коефіцієнтів мономіїв у спадному ступені. (тобто константа настає останньою). Поліном x^2-1має коріння {1,-1}. Поворот їх за 90°допомогою множення на i(уявна одиниця), тому вихідний многочлен повинен мати коріння {i,-i}, що є x^2 + 1.

Input / Output
[1 0 10 0 -127 0 -460 0 576]  [1 0 -10 0 -127 0 460 0 576]
[1 0 -4 0] [1 0 4 0]
[1] [1]

Чи можу я взяти як ступінь многочлена, так і полінома
— Рохан Джунджунвала

Так, я думаю, що це прийнятно.
— невдача

У всіх ваших прикладах використовуються монічні многочлени. Чи можна припустити, що вхідний многочлен буде монічним? Чи повинен вихідний многочлен бути монічним?
— Денніс

Ні, він також може мати інші провідні коефіцієнти, ніж 1, а вихід також просто визначений до інтегрального кратного.
— flawr

Здається, формат не повинен бути списком коефіцієнтів. Наскільки далеко проходять розумні формати? Може Чи мій формат бути строкове вираження в невизначеному x, так що моє уявлення може , рядок заміни xз (i*x)? Чи можна в моєму форматі функцію, яка оцінює поліном, щоб моє подання було скласти його з функцією x -> i*x?
— xnor

Відповіді:


12

Математика, 10 байт

Чиста функція, яка приймає функцію x і замінює в ix.

#/.x->I*x&

Альтернатива із лише 7 байтами, але не зовсім впевнена, чи зараховується вона. Чиста функція, яка приймає чисту функцію і повертає функцію x.

#[I*x]&

5
І вам навіть не потрібні були вбудовані!
— Ніл

Я впевнений, що поліном чистих функцій є "розумним форматом" (як це було тут ), він використовує #як змінну і має в &кінці.
— JungHwan Min

Я б схвалив це двічі, якби міг
— Грег Мартін

Моє єдине занепокоєння щодо другої відповіді було невідповідністю між входом (чиста функція) та виходом (функція x).
— Ян Міллер

6

Желе , 5 байт

Jı*Ċ×

Спробуйте в Інтернеті!

Як це працює

Помножує перший елемент на 1, третій елемент на -1і т.д.

Jı*Ċ×  argument: z
J      [1,2,...,len(z)]
 ı     i (the imaginary unit)
  *    to the power of (each element)
   Ċ   imaginary part
    ×  multiply by input (vectorize)

Доведення алгоритму

Нехай многочлен буде f(x).

Оскільки ми гарантуємо, що якщо xкорінь, то так -xі fмає бути , таким повинен бути парний, значить, його коефіцієнт для непарних сил повинен бути 0.

Тепер обертання коренів на по 90°суті f(ix).

Розширення та порівняння коефіцієнтів доводить алгоритм.


Отже, нам не потрібно торкатися 2,4-ї, 6-ї, 8-ї тощо?
— Rohan Jhunjhunwala

2
Це все одно нуль.
— flawr

Ваш трюк з ı*Ċдуже приємний, ви повинні пояснити це :)
— Лев

@Leo По суті це просто реалізація, хоча ...
— Leaky Nun

Логіка тут не зовсім правильна, тому що ви можете натомість, щоб усі коефіцієнти для рівних потужностей були 0.
— Ørjan Johansen

5

JavaScript (ES6), 25 байт

a=>a.map((e,i)=>i%4?-e:e)

Оригінальний многочлен має розв’язки форми, x = ±aде лежить на реальній чи уявній лінії. За винятком випадків, коли a = 0(в даному випадку xце множник многочлена), це означає, що x² - a²є коефіцієнтом многочлена (що означає, що альтернативні доданки завжди дорівнюють нулю). Тепер, коли ми обертаємо коріння, фактор змінюється на x² + a². Оскільки всі фактори змінюються одночасно, третій доданок многочлена, який є сумою всіх -a²доданків, змінює знак, п'ятий доданок, який є сумою добутків пар -a²доданків, зберігає однаковий знак тощо чергування кожного іншого терміна.


4

Октава , 27 байт

@(x)round(poly(roots(x)*j))

Спробуйте в Інтернеті!

Це безпосередньо стосується визначення: обчислити корені, помножити на j, перетворити назад з коренів у многочлен. Остаточне округлення необхідне через числові помилки з плаваючою комою.



1

SILOS , 71 66 байт

readIO
b=i
lbla
readIO
d=c
d&2
i=i*(1-d)
printInt i
b-1
c+1
if b a

Спробуйте в Інтернеті!

У мене немає поняття, що тут зробила майстра @Leaky Nun, щоб зберегти 5 байт.

Потрібно мені на секунду, щоб розібратися, але другий шматочок С буде чергуватися, як ми хочемо. Тому @Leaky Nun використала це, щоб зберегти потрібні нам біти.



0

TI-Basic, 20 байт

seq(real(i^X/i)Ans(X),X,1,dim(Ans

Якщо він зберігається prgmA, запустіть із:

{1, 0, 3, 0, 1}:prgmA

seq(просто повинен був бути один * команда , яка не підтримує комплексні числа. :)

*: Перебільшення


0

Casio-Basic, 8 байт

n|x=𝑖x

Безіменна функція, використовуючи метод математики Іана Міллера. Необхідно використовувати уявний keyboard на клавіатурі Math2 (вважає 2 байти, char код 769), а поліном слід вводити як рівняння x.

7 байт для коду, 1 байт вказати nяк параметр.

Пояснення : приймає рівняння n, то просто замінює всі екземпляри xз 𝑖x.



0

Стакс , 5 байт

Æ[]▐↨

Запуск та налагодження в Інтернеті!

Порт желейної відповіді.

Використовує представлення ASCII для пояснення:

mih|1*
m         Map each element with rest of program, print mapped results on individual lines
 i        Current 0-based loop index
  h       Floor(i/2)
   |1     (-1)^(i/2)
     *    Multiply with current element

Якщо можуть бути провідні нулі, їх потрібно спочатку обрізати, і це можна зробити ціною іншого байта.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.