Putar Akar

11

Diberikan polinom nol bukan dengan koefisien bilangan bulat dan akar yang ada di imajiner dan di garis nyata sehingga jika amerupakan akar maka demikian -a, kembalikan polinomial lain dengan akar diputar 90 derajat.

Detail

Polinomial dapat diberikan dalam format apa pun yang masuk akal, misalnya sebagai daftar koefisien. Kondisi simetri yang amerupakan root jika dan hanya jika -aroot juga memaksa polinomial yang diputar untuk memiliki koefisien integer nyata juga.

Contohnya

Berikut ini polinomial diberikan sebagai daftar koefisien monomial dalam derajat menurun. (yaitu konstanta datang terakhir) Polinomial x^2-1memiliki akar {1,-1}. Putar mereka dengan 90°cara mengalikan dengan i(unit imajiner), sehingga polinomial keluaran harus memiliki akar {i,-i}, yaitu 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]
cacat
sumber
Bolehkah saya mengambil tingkat polinomial dan polinomial
Rohan Jhunjhunwala
Ya saya pikir itu bisa diterima.
flawr
Semua contoh Anda menggunakan polinomial monik. Bisakah kita menganggap input polinomial akan menjadi monik? Apakah output polinomial harus menjadi monic?
Dennis
Tidak itu juga dapat memiliki koefisien terkemuka lainnya dari 1, dan outputnya juga baru saja didefinisikan hingga kelipatan integral.
flawr
Tampaknya formatnya tidak harus berupa daftar koefisien. Seberapa jauh format yang masuk akal? Bisakah format saya menjadi ekspresi string dalam waktu tidak ditentukan x, sehingga kiriman saya dapat diganti xdengan string (i*x)? Bisakah saya memformat fungsi yang mengevaluasi polinomial, sehingga kiriman saya untuk menyusunnya dengan fungsi x -> i*x?
xnor

Jawaban:

12

Mathematica, 10 Bytes

Fungsi murni yang mengambil fungsi x dan pengganti di ix.

#/.x->I*x&

Alternatif dengan hanya 7 byte tetapi tidak yakin apakah itu diperhitungkan. Fungsi murni yang mengambil fungsi murni dan mengembalikan fungsi x.

#[I*x]&
Ian Miller
sumber
5
Dan Anda bahkan tidak membutuhkan builtin!
Neil
Saya cukup yakin fungsi murni polinomial adalah "format yang masuk akal" (seperti di sini ) Ini digunakan #sebagai variabel dan memiliki &di akhir.
JungHwan Min
Saya akan mengangkat suara ini dua kali jika saya bisa
Greg Martin
Satu-satunya kekhawatiran saya tentang jawaban kedua adalah ketidakcocokan antara input (fungsi murni) dan output (fungsi x).
Ian Miller
6

Jelly , 5 byte

Jı*Ċ×

Cobalah online!

Bagaimana itu bekerja

Mengalikan elemen pertama dengan 1, elemen ketiga dengan -1, dll.

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

Bukti algoritma

Biarkan jumlahnya banyak f(x).

Karena kita dijamin bahwa jika xadalah root maka demikian juga -x, jadi fharus genap, artinya koefisien untuk kekuatan ganjil harus 0.

Sekarang, memutar akar pada 90°dasarnya f(ix).

Memperluas kemudian membandingkan koefisien membuktikan algoritma.

Biarawati Bocor
sumber
Jadi, kita tidak perlu menyentuh 2,4, 6, 8 dll?
Rohan Jhunjhunwala
2
Itu nol.
flawr
Trik Anda dengan ı*Ċsangat bagus, Anda harus menjelaskannya :)
Leo
@ Leo Pada dasarnya ini adalah implementasi yang mudah ...
Leaky Nun
Logikanya di sini tidak sepenuhnya benar, karena Anda dapat memiliki semua koefisien untuk kekuatan genap menjadi 0.
Ørjan Johansen
5

JavaScript (ES6), 25 byte

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

Polinomial asli memiliki solusi bentuk di x = ±amana a terletak pada garis nyata atau imajiner. Kecuali ketika a = 0(dalam hal xini merupakan faktor polinomial), ini berarti bahwa x² - a²merupakan faktor polinomial (yang berarti suku pengganti selalu nol). Sekarang ketika kita memutar akar, faktor berubah menjadi x² + a². Karena semua faktor berubah pada saat yang sama, istilah ketiga polinomial, yang merupakan jumlah dari semua -a²istilah, tanda perubahan, istilah kelima, yang merupakan jumlah produk dari pasangan -a²istilah, menyimpan tanda yang sama, dll bergantian setiap istilah lainnya.

Neil
sumber
4

Oktaf , 27 byte

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

Cobalah online!

Ini secara langsung menerapkan definisi: menghitung root, kalikan dengan j, mengkonversi kembali dari root ke polinomial. Pembulatan terakhir diperlukan karena kesalahan numerik floating-point.

Luis Mendo
sumber
1

SILOS , 71 66 byte

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

Cobalah online!

Saya tidak tahu apa yang dilakukan sihir @Leaky Nun di sini untuk menghemat 5 byte.

Butuh beberapa saat untuk mencari tahu, tetapi bit kedua C akan berganti seperti yang kita inginkan. Oleh karena itu @Leaky Nun memanfaatkan ini untuk menghemat bit yang kita butuhkan.

Rohan Jhunjhunwala
sumber
66 bytes
Leaky Nun
0

TI-Basic, 20 byte

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

Jika disimpan di prgmA, jalankan dengan:

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

seq(hanya harus menjadi perintah * satu yang tidak mendukung angka kompleks. :)

*: Berlebihan

pizzapants184
sumber
0

Casio-Basic, 8 byte

n|x=𝑖x

Fungsi yang tidak disebutkan namanya, menggunakan pendekatan Mathematica Ian Miller. Imag imajiner dari keyboard Math2 perlu digunakan (dihitung sebagai 2 byte, kode char 769), dan polinomial harus dimasukkan sebagai persamaan x.

7 byte untuk kode, 1 byte untuk ditentukan nsebagai parameter.

Penjelasan : Mengambil persamaan n, lalu cukup mengganti semua instance xdengan 𝑖x.

numbermaniac
sumber
0

Stax , 5 byte

Æ[]▐↨

Jalankan dan debug online!

Port jawaban Jelly.

Menggunakan representasi ASCII untuk menjelaskan:

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

Jika ada nol di depan, mereka harus dipangkas terlebih dahulu dan itu bisa dilakukan dengan biaya byte lain.

Weijun Zhou
sumber