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


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.