Kökleri Döndür


11

Hayali ve gerçek çizgi üzerinde tamsayı katsayıları ve kökleri olan sıfır olmayan bir polinom verildiğinde, eğer abir kök ise -a, 90 derece döndürülmüş köklerle başka bir polinom döndürün.

ayrıntılar

Polinom herhangi bir makul formatta, örneğin bir katsayı listesi olarak verilebilir. aBir kök ise ve sadece bir kök ise simetri koşulu -a, döndürülmüş polinomu da gerçek tamsayı katsayılarına sahip olmaya zorlar.

Örnekler

Aşağıda polinomlar, azalan derecede monomların katsayılarının bir listesi olarak verilmiştir. (yani sabit en son gelir) Polinomun x^2-1kökleri vardır {1,-1}. Bunları döndürme 90°ile çarpılması vasıtasıyla içıkış polinom kökleri bu yüzden, (sanal ünitesi) {i,-i}olan 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]

Polinomun yanı sıra polinom derecesini de alabilir miyim
— Rohan Jhunjhunwala

Evet bence bu kabul edilebilir.
— Kusur

Tüm örnekleriniz monik polinomları kullanır. Giriş polinomunun monik olacağını varsayabilir miyiz? Çıktı polinomunun monik olması gerekiyor mu?
— Dennis

Hayır, 1'den başka önde gelen katsayılara da sahip olamaz ve çıktı sadece bir integral katına kadar tanımlanır.
— Kusur

Biçimin bir katsayı listesi olması gerekmiyor gibi görünüyor. Makul biçimler ne kadar ileri gider? Benim biçim belirsiz bir dize ifadesi olabilir xbenim teslim teneke dize değiştirme, böylece xile (i*x)? Benim biçimim, polinomu değerlendiren bir işlevi kullanabilir mi, böylece benim gönderim işlevi ile oluşturmaktır x -> i*x?
— xnor

Yanıtlar:


12

Mathematica, 10 Bayt

X işlevini alan ve ix yerine kullanılan saf işlev.

#/.x->I*x&

Sadece 7 bayt ile alternatif ama sayar mı emin değilim. Saf işlevi alan ve x işlevini döndüren saf işlev.

#[I*x]&

5
Ve herhangi bir yerleşime bile ihtiyacınız yoktu!
— Neil

Ben saf bir işlev polinom "makul bir biçim" olduğundan eminim ( burada olduğu gibi ) #Değişken olarak kullanır &ve sonunda bir vardır.
— JungHwan Min

Mümkünse bunu iki kez değerlendiririm
— Greg Martin

İkinci cevap hakkındaki tek endişem girdi (saf fonksiyon) ve çıktı (x fonksiyonu) arasındaki uyumsuzluktu.
— Ian Miller

6

Jöle , 5 bayt

Jı*Ċ×

Çevrimiçi deneyin!

Nasıl çalışır

İlk öğeyi 1, üçüncü öğeyi -1vb. İle çarpar .

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

Algoritma kanıtı

Polinom olsun f(x).

Eğer xbir kök ise -x, o fzaman eşit olmalı, yani tek güçler için katsayısının olması gerektiği garanti edilir 0.

Şimdi, kökleri döndürmek 90°aslında f(ix).

Genişletildikten sonra katsayıların karşılaştırılması algoritmayı kanıtlar.


Yani, 2,4, 6, 8 vb.
— Rohan Jhunjhunwala

2
Bunlar yine de sıfır.
— Kusur

Senin hile ı*Ċçok güzel, açıklamalısın :)
— Leo

@Leo Bu aslında basit bir uygulama olsa da ...
— Leaky Nun

Buradaki mantık tam olarak doğru değil, çünkü bunun yerine eşit güçler için tüm katsayılara sahip olabilirsiniz.
— Ørjan Johansen

5

JavaScript (ES6), 25 bayt

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

Orijinal polinom, x = ±agerçek veya hayali çizgide bir yalanın bulunduğu formun çözümlerine sahiptir . Ne zaman hariç a = 0(bu durumda xpolinomun bir faktörüdür), bu polinomun x² - a²bir faktörüdür (alternatif terimler her zaman sıfırdır). Şimdi kökleri döndürdüğümüzde faktör olarak değişir x² + a². Tüm faktörler aynı anda -a²değiştiğinden , tüm terimlerin toplamı olan polinomun üçüncü terimi , değişim işareti, -a²terimlerin çiftlerinin toplamı olan beşinci terim aynı işareti tutar, vb. diğer her terimi değiştirerek.


4

Oktav , 27 bayt

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

Çevrimiçi deneyin!

Bu doğrudan tanımı uygular: kökleri hesapla, çarpma j, köklerden polinomlara geri dönüş. Kayan noktalı sayısal hatalar nedeniyle son bir yuvarlama gereklidir.



1

SILOS , 71 66 bayt

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

Çevrimiçi deneyin!

@Leaky Nun'in sihirbazın 5 bayt kurtarmak için ne yaptığını bilmiyorum.

Anlamak için bana bir saniye sürdü, ama C'nin ikinci biti istediğimiz gibi değişecektir. Bu nedenle @Leaky Nun, ihtiyacımız olan bitleri kurtarmak için bundan faydalandı.



0

TI-Basic, 20 bayt

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

Depolanırsa prgmA, şunlarla çalıştırın:

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

seq(karmaşık sayıları desteklemeyen tek * komut olmalıydı . :)

*: Abartı


0

Casio-Basic, 8 bayt

n|x=𝑖x

İsimsiz işlev, Ian Miller'ın Mathematica yaklaşımını kullanarak. Math2 klavyesinden gelen hayali 𝑖'nin kullanılması gerekir (2 bayt, char kodu 769 olarak sayılır) ve polinom bir denklem olarak girilmelidir x.

Kod için 7 bayt, nparametre olarak belirtilecek 1 bayt .

Açıklama : Denklemi nalır, ardından tüm örneklerini xile değiştirir 𝑖x.



0

Stax , 5 bayt

Æ[]▐↨

Çevrimiçi çalıştırın ve hata ayıklayın!

Jelly bağlantı noktası.

ASCII temsilini açıklamak için kullanır:

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

Eğer önde gelen sıfırlar varsa, önce kesilmeleri gerekir ve başka bir bayt pahasına yapılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.