Многочлены Чебышёва (Chebyshev Polinomları)


26

Chebyshev Polinomları , matematiğin her yerinde ortaya çıkan ortogonal polinomların bir ailesidir ve oldukça ilginç özelliklere sahiptir. Bunların bir özelliği, onların tatmin edici benzersiz polinomlar olmalarıdır .Tn(cos(x)) = cos(n*x)

Meydan okuma

Negatif olmayan bir tamsayı verildiğinde n, nChebyshev Polinomu'nu çıkarmalısınız . .Tn(x)

Tanım

nOyunu bırakanların Chebyshev Polinom üç dönem Özyinelemeyi izleyerek verilir:

T0(x) = 1
T1(x) = x
Tn+1(x) = 2*x*Tn(x) - Tn-1(x)

ayrıntılar

Dilinizde yerel bir polinom türü varsa, bunu bir çıkış olarak kullanabilirsiniz, aksi takdirde artan veya azalan düzende veya bir polinomu temsil eden bir dize olarak bir katsayı listesi çıkarmanız gerekir.

Örnekler

T0(x) = 1
T1(x) = x 
T2(x) = 2x^2 - 1
T3(x) = 4x^3 - 3 x
T4(x) = 8x^4 - 8x^2 + 1
T5(x) = 16x^5 - 20x^3 + 5x
T10(x) = 512x^10 - 1280x^8 + 1120x^6 - 400x^4 + 50x^2 - 1

Azalan derece liste biçiminde alacağız ve yükselen derece biçiminde alacağızT3(x) = [4,0,-3,0]T3(x) = [0,-3,0,4]


Bir liste çıkarırsam, bunun için 0 1(yani 0*x+1) çıktı alabilir miyim T_0?
Luis Mendo,

Monomların sırası tutarlı olduğu sürece sorun yok!
kusur

@flawr 2*x*(2*x**2 - 1) - xpolinom destekleyici lang için 3 için çıktı olarak tamam mı, yoksa azalan katsayılar olarak gösterime ihtiyacımız var mı?
Uriel


2
Kayan nokta yanlışlıkları kabul edilebilir mi? örn.T_5(n) = [0, 5, 3.55271e-15, -20, 0, 16]
miller

Yanıtlar:


15

Mathematica, 15 bayt

#~ChebyshevT~x&

Tabii ki, Mathematica'nın bir yerleşimi var.

Alternatif bir giriş formuna izin verilirse (10 bayt):

ChebyshevT

bir tamsayı nve değişken alır.


3
Tahmin edemezdim, ha. : P
HyperNeutrino,

14

Octave , 39 bayt

@(n)round(2^n/2*poly(cos((.5:n)/n*pi)))

Çevrimiçi deneyin!

açıklama

cos((.5:n)/n*pi)tarafından verilen polinomun kökleri ile bir vektör oluşturur .

görüntü tanımını buraya girin

polyBu köklü monik polinomu verir. Çarpma 2^n/2katsayıları gerektiği gibi ölçeklendirir. roundNümerik hassasiyete rağmen sonuçların tamsayı olmasını sağlar.


1
Her zamanki gibi zekice :)
kusur,


10

Haskell , 62 bayt

t n|n<2=1:[0|n>0]|x<-(*2)<$>t(n-1)++[0]=zipWith(-)x$0:0:t(n-2)

Çevrimiçi deneyin!

kusur bir bayt kaydetti.


Bu çok zarif! ( zipWithVektör işlemleri için unutmaya devam ediyorum .)
kusur,

1
Sanırım gardiyanları kullanarak bir bayttan daha fazla tasarruf edebileceğinizi düşünüyorum:, t n|n<2=1:[0|n>0]|x<-(*2)<$>t(n-1)++[0]=zipWith(-)x$0:t(n-2)bu şekilde orta parantez çiftini son satırda
kaldırabilirsiniz

Sana değişikliğine olduğunu düşünüyorum 0:için 0:0:sadece sıfır atlayarak bu tür izin verilmeyen OP -.
Ørjan Johansen




5

MATL , 17 bayt

lFTi:"0yhEbFFh-]x

Katsayılar artan derece sırasına göre çıkarılır.

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

N girişi için , kod n kere özyinelemeli ilişkiyi uygular . En son iki polinom daima yığında tutulur. Yeni bir polinom hesaplandığında, en eskileri kaldırılır.

Sonunda, ikinci son polinom görüntülenir (son polinom silinir), çok fazla yineleme yaptık.

l        % Push 1
FT       % Push [0 1]. These are the first two polynomials
i:"      % Input n. Do the following n times
  0      %   Push 0
  y      %   Duplicate most recent polynomial
  h      %   Concatenate: prepends 0 to that polynomial
  E      %   Multiply coefficients by 2
  b      %   Bubble up. This moves second-most recent polynomial to top
  FF     %   Push [0 0]
  h      %   Concatenate: appends [0 0] to that polynomial
  -      %   Subtract coefficients
]        % End
x        % Delete. Implicitly display

4

Jöle , 18 bayt

Cr1µ’ßḤ0;_’’$ß$µỊ?

Çevrimiçi deneyin!

Artan sıradaki katsayıların listesini döndürür.

Kayan nokta yanlışlıkları olan 17 bayt için başka bir çözüm var .

RḤ’÷Ḥ-*ḞÆṛæ«’µ1Ṡ?

Çevrimiçi deneyin!

açıklama

Cr1µ’ßḤ0;_’’$ß$µỊ?  Input: integer n
                Ị   Insignificant - abs(n) <= 1
                    If true, n = 0 or n = 1
   µ                  Monadic chain
C                       Complement, 1-x
 r1                     Range to 1
                    Else
               µ      Monadic chain
    ’                   Decrement
     ß                  Call itself recursively
      Ḥ                 Double
       0;               Prepend 0
         _              Subtract with
            $             Monadic chain
          ’’                Decrement twice
              $           Monadic chain
             ß              Call itself recursively


2

Ruby + polinom , 59 58 + 13 = 72 71 bayt

-rpolynomialBayrağı kullanır .

f=->n{x=Polynomial.new 0,1;n<2?[1,x][n]:2*x*f[n-1]-f[n-2]}

2

J , 33 bayt

(0>.<:)2&*1:p.@;9:o._1^+:%~1+2*i.

Çevrimiçi deneyin!

Kayan noktadaki yanlışlıkların kabul edilebilir olduğunu ve emojiyi yarattığını varsayar. (0>.<:)

İçin 41 bayt , yüzen önler başka bir çözüm yoktur.

(0&,1:)`(-&2((-,&0 0)~2*0&,)&$:<:)@.(>&1)

Çevrimiçi deneyin!



2

Aksiyom, 40 bayt

f(n,x)==(n<2=>x^n;2*x*f(n-1,x)-f(n-2,x))

Sonuçlar

(9) -> for i in [0,1,2,3,4,5,10] repeat output ["f(y)",i,"=", f(i,y)]
   ["f(y)",0,"=",1]
   ["f(y)",1,"=",y]
                   2
   ["f(y)",2,"=",2y  - 1]
                   3
   ["f(y)",3,"=",4y  - 3y]
                   4     2
   ["f(y)",4,"=",8y  - 8y  + 1]
                    5      3
   ["f(y)",5,"=",16y  - 20y  + 5y]
                      10        8        6       4      2
   ["f(y)",10,"=",512y   - 1280y  + 1120y  - 400y  + 50y  - 1]
                                                               Type: Void

Axiom'da formül için bir ikame yasasını tanımlamak mümkündür, burada n (bir tamsayıdır)

(9) -> o:=rule cos(n*%y)==f(n,cos(%y))
   (9)  cos(%y n) == 'f(n,cos(%y))
                    Type: RewriteRule(Integer,Integer,Expression Integer)
                                                              Time: 0 sec
(10) -> b:=o cos(20*x)
   (10)
                 20                18                16                14
     524288cos(x)   - 2621440cos(x)   + 5570560cos(x)   - 6553600cos(x)
   +
                  12                10               8              6
     4659200cos(x)   - 2050048cos(x)   + 549120cos(x)  - 84480cos(x)
   +
               4            2
     6600cos(x)  - 200cos(x)  + 1
                                                 Type: Expression Integer
                       Time: 0.48 (EV) + 0.02 (OT) + 0.10 (GC) = 0.60 sec

1

C # (.NET Core) , 126 bayt

f=n=>n==0?new[]{1}:n==1?new[]{0,1}:new[]{0}.Concat(f(n-1)).Select((a,i)=>2*a-(i<n-1?f(n-2)[i]:0)).ToArray();

Bayt sayısı ayrıca şunları içerir:

using System.Linq;

Çevrimiçi deneyin!

İşlev, artan düzende bir katsayı dizisi olarak polinomu döndürür (dan / x^0dan x^n)

Açıklama:

f = n =>                          // Create a function taking one parameter (int)
    n == 0 ? new[] { 1 } :        // If it's 0, return collection [1]
    n == 1 ? new[] { 0, 1 } :     // If it's 1, return collection [0,1] (so x + 0)
    new[] { 0 }                   // Else create new collection, starting with 0
        .Concat(f(n - 1))         // Concatenate with f(n-1), effectively multiplying polynomial by x
        .Select((a, i) => 2 * a - (i < n - 1 ? f(n - 2)[i] : 0))
                                  // Multiply everything by 2 and if possible, subtract f(n-2)
        .ToArray();               // Change collection to array so we have a nice short [] operator
                                  // Actually omitting this and using .ElementAt(i) is the same length, but this is my personal preference

1

JavaScript (ES6), 65 bayt

f=n=>n?n>1?[0,...f(n-1)].map((e,i)=>e+e-(f(n-2)[i]||0)):[0,1]:[1]

Büyük için verimsiz n. İlginç ama ne yazık ki aynı zamanda verimsiz:

n=>[...Array(n+1)].map(g=(m=n,i)=>i<0|i>m?0:m<2?i^m^1:g(m-1,i-1)*2-g(m-2,i))

68 bayt için çok verimli:

f=(n,a=[1],b=[0,1])=>n?f(n-1,b,[0,...b].map((e,i)=>e+e-(a[i]||0))):a

Artan düzende bir katsayı dizisi döndürür.

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.