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

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]
flawr
источник
Могу ли я взять в степени многочлена, а также многочлена
Рохан 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 воспользовалась этим, чтобы сохранить нужные нам биты.

Рохан Джунджхунвала
источник
66 байт
Утренняя монахиня
0

TI-Basic, 20 байтов

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

Если хранится в prgmA, запустить с:

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

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

*: Преувеличение

pizzapants184
источник
0

Casio-Basic, 8 байт

n|x=𝑖x

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

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

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

numbermaniac
источник
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

Если могут быть начальные нули, их нужно сначала обрезать, и это можно сделать за счет другого байта.

Вейцзюнь Чжоу
источник