Многочлены Чебышёва (Polynômes de Chebyshev)


26

Les polynômes de Chebyshev sont une famille de polynômes orthogonaux qui apparaissent dans toutes sortes d'endroits en mathématiques, et ils ont beaucoup de propriétés assez intéressantes. Une caractérisation d'entre eux est qu'ils sont les polynômes uniques qui satisfont .Tn(cos(x)) = cos(n*x)

Défi

Étant donné un entier non négatif n, vous devez afficher le n-th Polynôme de Chebyshev. .Tn(x)

Définition

Le n-ième polynôme de Chebyshev est donné en suivant la récursivité à trois termes:

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

Détails

Si votre langue a un type de polynôme natif, vous pouvez l'utiliser comme sortie, sinon vous devez sortir une liste de coefficients dans l'ordre croissant ou décroissant, ou comme une chaîne représentant un polynôme.

Exemples

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

Dans le format de liste des degrés décroissants, nous obtenions et dans le format de degré croissant, nous obtenionsT3(x) = [4,0,-3,0]T3(x) = [0,-3,0,4]


Si je produis une liste, puis-je produire 0 1(c'est-à-dire 0*x+1) pour T_0?
Luis Mendo

Tant que l'ordre des monômes est cohérent, c'est ok!
flawr

@flawr est 2*x*(2*x**2 - 1) - xok comme sortie pour 3 pour les langages de support polynom, ou avons-nous besoin de la représentation sous forme de coefficients desc?
Uriel


2
Les inexactitudes en virgule flottante sont-elles acceptables? soitT_5(n) = [0, 5, 3.55271e-15, -20, 0, 16]
miles

Réponses:


15

Mathematica, 15 octets

#~ChebyshevT~x&

Bien sûr, Mathematica a une fonction intégrée.

Si un autre formulaire d'entrée est autorisé (10 octets):

ChebyshevT

prend un entier net une variable.


3
Je n'aurais pas pu deviner, hein. : P
HyperNeutrino

14

Octave , 39 octets

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

Essayez-le en ligne!

Explication

cos((.5:n)/n*pi)construit un vecteur avec les racines du polynôme , donné par

entrez la description de l'image ici

polydonne le polynôme monique avec ces racines. Multipliant par des 2^n/2échelles les coefficients selon les besoins. rounds'assure que les résultats sont entiers malgré la précision numérique.


1
Intelligent comme toujours :)
flawr


10

Haskell , 62 octets

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

Essayez-le en ligne!

flawr a enregistré un octet.


C'est très élégant! ( zipWith
J'oublie toujours les

1
Je pense que vous pouvez même enregistrer un octet de plus en utilisant des gardes t n|n<2=1:[0|n>0]|x<-(*2)<$>t(n-1)++[0]=zipWith(-)x$0:t(n-2)
:, de

Je pense que vous devez changer 0:pour 0:0:- OP vient d'interdire ce genre de sauter les zéros.
Ørjan Johansen

7

CJam (21 octets)

1a2,qi{0X$+2f*@.-}*;`

Ceci est un programme complet: l'équivalent d'un bloc anonyme est de la même longueur:

{1a2,@{0X$+2f*@.-}*;}

Démo en ligne




5

MATL , 17 octets

lFTi:"0yhEbFFh-]x

Les coefficients sont sortis par ordre croissant de degré.

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

Pour l'entrée n , le code applique la relation récursive n fois. Les deux polynômes les plus récents sont toujours conservés dans la pile. Lorsqu'un nouveau polynôme est calculé, le plus ancien est supprimé.

À la fin, l'avant-dernier polynôme est affiché (le dernier polynôme est supprimé), car nous avons effectué une itération de trop.

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

Gelée , 18 octets

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

Essayez-le en ligne!

Renvoie une liste de coefficients dans l'ordre croissant.

Il existe une autre solution pour 17 octets avec des inexactitudes en virgule flottante.

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

Essayez-le en ligne!

Explication

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 + polynôme , 59 58 + 13 = 72 71 octets

Utilise le -rpolynomialdrapeau.

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

2

J , 33 octets

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

Essayez-le en ligne!

Suppose que les inexactitudes en virgule flottante sont acceptables et crée les emoji (0>.<:)

Pour 41 octets , il existe une autre solution qui évite les flottants.

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

Essayez-le en ligne!



2

Axiome, 40 octets

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

résultats

(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

il est possible de définir une loi de substitution pour la formule dans l'utilisation d'Axiom au-dessus de la fonction f () pour l'expansion de cos (n * x) où n est un entier

(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 octets

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();

Le nombre d'octets comprend également:

using System.Linq;

Essayez-le en ligne!

La fonction renvoie un polynôme sous la forme d'un tableau de coefficients dans l'ordre croissant (de x^0à x^n)

Explication:

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 octets

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

Inefficace pour les grands n. Intéressant mais malheureusement aussi inefficace:

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))

Très efficace pour 68 octets:

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

Renvoie un tableau de coefficients dans l'ordre croissant.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.