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


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.