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.