МногочленыЧебышёва(Chebyshev多项式)


26

Chebyshev多项式是一个正交多项式的族,它们在数学中的各个位置弹出,它们具有许多非常有趣的属性。它们的一个特征是它们是满足的唯一多项式。Tn(cos(x)) = cos(n*x)

挑战

给定一个非负整数n,您应该输出n-th Chebyshev多项式。。Tn(x)

定义

n个切比雪夫多项式由以下三个递推公式给出:

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

细节

如果您的语言具有本机多项式类型,则可以将其用作输出,否则应按升序或降序输出系数列表,或将其作为代表多项式的字符串输出。

例子

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

在降序列表格式中,我们得到,而在升序列表格式中,我们得到T3(x) = [4,0,-3,0]T3(x) = [0,-3,0,4]


如果我输出一个列表,我可以输出0 10*x+1T_0吗?
路易斯·门多

只要单项式的顺序一致就可以了!
瑕疵

@flawr可以2*x*(2*x**2 - 1) - x作为多项式支持lang的3的输出,还是我们需要将其表示为desc coeffs?
Uriel's


2
浮点误差是否可以接受?即T_5(n) = [0, 5, 3.55271e-15, -20, 0, 16]
英里

Answers:


15

Mathematica,15个字节

#~ChebyshevT~x&

当然,Mathematica具有内置功能。

如果允许使用其他输入形式(10个字节):

ChebyshevT

接受一个整数n和一个变量。


3
不可能猜到吧。:P
HyperNeutrino

14

八度,39字节

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

在线尝试!

说明

cos((.5:n)/n*pi)多项式构建一个向量,由

在此处输入图片说明

poly给出具有这些根的单项多项式。2^n/2根据需要乘以比例系数。round即使数值精确,也要确保结果是整数。


1
一如既往的聪明:)
更加模糊


10

Haskell,62个字节

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

在线尝试!

骗子节省了一个字节。


这非常优雅!(我一直忘了zipWith进行矢量操作。)
瑕疵的,

1
我认为您甚至可以通过使用guards来节省一个字节:t n|n<2=1:[0|n>0]|x<-(*2)<$>t(n-1)++[0]=zipWith(-)x$0:t(n-2),这样您就可以删除最后一行中的中间一对括号:)
瑕疵的

我认为您必须更改0:0:0:-OP不允许这种跳过零的方法。
与Orjan约翰森

7

CJam(21字节)

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

这是一个完整的程序:与匿名块等效的长度是相同的:

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

在线演示




5

MATL,17个字节

lFTi:"0yhEbFFh-]x

系数以递增的顺序输出。

在线尝试!验证所有测试用例

说明

对于输入n,代码将n次应用递归关系。最近的两个多项式始终保留在堆栈中。计算新多项式时,最早的多项式将被删除。

最后,显示倒数第二个多项式(删除了最后一个多项式),因为我们进行了太多次迭代。

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

果冻,18字节

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

在线尝试!

以升序返回系数列表。

还有一种针对具有浮点错误的17个字节的解决方案。

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

在线尝试!

说明

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 + 多项式59 58 + 13 = 72 71字节

使用-rpolynomial标志。

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

2

J,33字节

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

在线尝试!

假设浮点错误是可以接受的,并创建表情符号 (0>.<:)

对于41个字节,还有另一种避免浮动的解决方案。

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

在线尝试!



2

公理,40字节

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

结果

(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

可以在f()函数上方为cos(n * x)的展开定义公理中使用的公式的一个替换定律,其中n是一个整数

(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字节

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

字节数还包括:

using System.Linq;

在线尝试!

函数以升序(从x^0x^n)将多项式作为系数数组返回

说明:

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个字节

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

低效率的大n。有趣但令人遗憾的是效率低下:

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字节非常有效:

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

以升序返回系数数组。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.