Поверните корни


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]

Могу ли я взять в степени многочлена, а также многочлена
Рохан Jhunjhunwala

Да, я думаю, что это приемлемо.
flawr

Все ваши примеры используют монические полиномы. Можем ли мы предположить, что входной многочлен будет моническим? Имеет ли многочлен выход должен быть унитарными?
Деннис

Нет, он также может иметь другие ведущие коэффициенты, отличные от 1, и выход также просто определяется с точностью до целого кратного.
flawr

Кажется, формат не должен быть списком коэффициентов. Как далеко зашли разумные форматы? Может ли мой формат быть строковое выражение в неопределенном x, так что мое представление может , строка замены xс (i*x)? Могу ли я отформатировать функцию, которая оценивает полином, так что моя заявка состоит в том, чтобы составить ее с помощью функции x -> i*x?
xnor

Ответы:


12

Mathematica, 10 байт

Чистая функция, которая принимает функцию от x и подставляет в ix.

#/.x->I*x&

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

#[I*x]&

5
И вам даже не нужно было никаких встроенных!
Нил

Я почти уверен, что чистый полином функции - это «разумный формат» (как это было здесь ). Он использует #переменную и имеет &в конце.
JungHwan Мин

Я бы проголосовал дважды, если бы мог
Грег Мартин,

Мое единственное беспокойство по поводу второго ответа было несоответствие между вводом (чистая функция) и выводом (функция х).
Ян Миллер

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 и т. Д.?
Рохан

2
Это все равно ноль.
flawr

Ваш трюк с ı*Ċочень хорош, вы должны это объяснить :)
Лев

@Leo Это, по сути, простая реализация ...
Leaky Nun

Логика здесь не совсем
Оржан Йохансен

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

СИЛОС , 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 байт.

Мне потребовалась секунда, чтобы понять, но второй бит C будет чередоваться, как мы хотим. Поэтому @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

Безымянная функция, используя подход Mathematica Яна Миллера. Необходимо использовать мнимый 𝑖 с клавиатуры Math2 (считается как 2 байта, код символа 769), а полином должен быть введен как уравнениеx .

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

Объяснение : принимает уравнение n, то просто заменяет все экземпляры xс 𝑖x.



0

Stax , 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.