特定の値の多項式のn番目の反復を計算します。fⁿ(x)


19

多項式関数f(たとえば、昇順または降順の実係数のリストp)、非負の整数n、および実数値xが与えられると、次を返します:

   f nx

すなわち、の値FFF(... FX用)...)))NのアプリケーションFX

妥当な精度と丸めを使用します。

係数のリストとしてfを使用するソリューションがおそらく最も興味深いでしょうが、fを実際の関数として使用できる場合は(このチャレンジを些細な「関数をn回適用」することで軽減できます)、自由に含めることができます。自明でない解決策の後。

事例

p  = [1,0,0]またはf  = x^2、  n  = 0、  x  = 3:  f 0(3)=3

p  = [1,0,0]またはf  = x^2、  n  = 1、  x  = 3:  f 1(3)=9

p  = [0.1,-2.3,-4]またはf  = 0.1x^2-2.3x-4、  n  = 0、  x  = 2.3:  f 0(2.3)=2.3

p  = [0.1,-2.3,-4]またはf  = 0.1x^2-2.3x-4、  n  = 1、  x  = 2.3:  f 1(2.3)=-8.761

p  = [0.1,-2.3,-4]またはf  = 0.1x^2-2.3x-4、  n  = 2、  x  = 2.3:  f 2(2.3)=23.8258

p  = [0.1,-2.3,-4]またはf  = 0.1x^2-2.3x-4、  n  = 3、  x  = 2.3:  f 3(2.3)=-2.03244

p  = [0.1,-2.3,-4]またはf  = 0.1x^2-2.3x-4、  n  = 4、  x  = 2.3:  f 4(2.3)=1.08768

p  = [0.1,-2.3,-4]またはf  = 0.1x^2-2.3x-4、  n  = 5、  x  = 2.3:  f 5(2.3)=-6.38336

p  = [0.1,-2.3,-4]またはf  = 0.1x^2-2.3x-4、  n  = 6、  x  = 2.3:  f 6(2.3)=14.7565

p  = [0.1,-2.3,-4]またはf  = 0.1x^2-2.3x-4、  n  = 7、  x  = 2.3:  f 7(2.3)=-16.1645

p  = [0.1,-2.3,-4]またはf  = 0.1x^2-2.3x-4、  n  = 8、  x  = 2.3:  f 8(2.3)=59.3077

p  = [0.1,-2.3,-4]またはf  = 0.1x^2-2.3x-4、  n  = 9、  x  = 2.3:  f 9(2.3)=211.333

p  = [0.1,-2.3,-4]またはf  = 0.1x^2-2.3x-4、  n  = 10、  x  = 2.3:  f 10(2.3)=3976.08

p  = [0.1,-2.3,-4]またはf  = 0.1x^2-2.3x-4、  n  = 11、  x  = 2.3:  f 11(2.3)=1571775

p  = [-0.1,2.3,4]またはf  = −0.1x^2+2.3x+4、  n  = 0、  x  = -1.1:  f 0(-1.1)=-1.1

p  = [-0.1,2.3,4]またはf  = −0.1x^2+2.3x+4、  n  = 1、  x  = -1.1:  f 1(-1.1)=1.349

p  = [-0.1,2.3,4]またはf  = −0.1x^2+2.3x+4、  n  = 2、  x  = -1.1:  f 2(-1.1)=6.92072

p  = [-0.1,2.3,4]またはf  = −0.1x^2+2.3x+4、  n  = 14、  x  = -1.1:  f 14(-1.1)=15.6131

p  = [0.02,0,0,0,-0.05]またはf  = 0.02x^4-0.05、  n  = 25、  x  = 0.1:  f 25(0.1)=-0.0499999

p  = [0.02,0,-0.01,0,-0.05]またはf  = 0.02x^4-0.01x^2-0.05、  n  = 100、  x  = 0.1:  f 100(0.1)=-0.0500249



私のゼリーの答えは、例えばゼリーのリンクを取り、それを「機能」とみなすことができますか?
エリックアウトゴルファー

@EriktheOutgolfer私はもともと、このような些細な解決策を防ぐために、係数のリストとして入力が必要でした。ただし、リクエストに応じてリラックスしました。リストバージョンを投稿し、簡単なバージョンをメモ(またはその反対)として追加することをお勧めします。
アダム

既にリストバージョンを投稿しましたが、関数バージョンはかなり短くなっています。
エリックアウトゴルファー

@EriktheOutgolferええ、明らかに。追加したメモを参照してください。
アダム

回答:


7

オクターブ、49バイト

@(p,x,n)(f=@(r,m){@()p(r(r,m-1)),x}{~m+1}())(f,n)

オンラインでお試しください!

または、係数を取る:

オクターブ75 57バイト

@(p,x,n)(f=@(f,n){@()polyval(p,f(f,n-1)),x}{~n+1}())(f,n)

オンラインでお試しください!

StackOverflowのSueverに特別な感謝を捧げます。先ほどの私の質問に対するこの回答に対して、再帰的な匿名関数が可能であることを証明しています。

これは、匿名関数を定義します。これは、 再帰的な匿名関数の。ネイティブのOctaveの概念ではなく、空想的なセル配列のインデックス付けが必要なもの。

おまけとして、2番目のバージョンは、Octaveの変数スコープに関する素晴らしいレッスンです。のすべてのインスタンスをr合法的にに置き換えることができますf。これにより、既存のf最もローカルなスコープにが(と同様n

説明

@(p,x,n)(f=@(r,m){@()p(r(r,m-1)),x}{~m+1}())(f,n)
@(p,x,n)         .                ..    .  ..   .   % Defines main anonymous function    
        (f=@(r,m).                ..    .  ).   .   % Defines recursive anonymous function
                 .                ..    .   .   .   %  r: Handle ('pointer') to recursive function
                 .                ..    .   .   .   %  m: Current recursion depth (counting from n to 0)
                 .                ..    .   (f,n)   % And call it, with
                 .                ..    .           %  r=f (handle to itself)
                 .                ..    .           %  m=n (initial recursion)
                 {                }{    }           % Create and index into cell array
                                    ~m+1            %  Index: for m>0: 1; for m==0: 2.
                                ,x                  %  Index 2: final recursion, just return x.
                  @()                               %  Index 1: define anonymous function, taking no inputs.
                     p(        )                    %   which evaluates the polynomial 
                       r(     )                     %    of the recursive function call
                         r,m-1                      %     which is called with r 
                                                    %     and recursion depth m-1 
                                                    %     (until m=0, see above)
                                         ()         % Evaluate the result of the cell array indexing operation.
                                                    %  which is either the anonymous function
                                                    %  or the constant `x`.

これの鍵は、匿名関数が定義されたときに評価されないことです。そのため、の直後に@()呼び出される匿名関数を定義するため、少し余分なように見えますが、()実際には厳密に必要です。呼び出されない限りインデックス作成ステートメントによって選択され、。

オクターブ、39バイト(退屈な方法)

function x=f(p,x,n)for i=1:n;o=p(o);end

完全を期すために、最短バイト数のOctaveソリューション。 あくび。


私はこれをもう一度読み直そうとしますが、私はまだそれを得ることはできません。
ミクサン

2
@Michthanはより良い説明を試みますが、これは私が書いた中で最も簡潔なOctaveです-通常、関数名はバイトカウントの大部分です。ほとんどLispです。
-Sanchises

1
@Michthanうまくいけば、新しい説明が意味をなして、「爆発した」ビューでそれを見ることができます。
Sanchises

4

Mathematica、56 47 28バイト

Nest[x\[Function]x#+#2&~Fold~#,##2]&

\[Function] UTF-8では3バイトかかります。

パラメータを順番に取得しますp,x,n

p (パラメーター1)は次数の昇順です。

明らかにf関数として取得できる場合、これはに減らすことができますNest


係数を逆にする必要がありますか?
ジュゼッペ

@GiuseppeそれReverseがコードにある理由です。
-user202729

@ user202729昇順または降順の任意の順序で係数を取得できると思います。
エリックアウトゴルファー

私たちは、それらを学位の昇順または降順で取得することを許可されています。(Mathematicaをまったく知らない)
ジュゼッペ

はい、あなたは所望の順序でそれらを取ることができますすることができます:昇順または降順に
アダム・

4

、5バイト

←↓¡`B

オンラインでお試しください!

ここでの重要な考え方は、ポイントxで政治を評価することは、ベースxからベース変換を実行することと同等であるということです。

Bベースと数字のリストを指定すると、ベース変換が実行されます。ここでは、最初に数字のリストを取得し、この関数を部分的に適用するために、反転バージョンを使用します。次に、ある点で与えられた多項式の値を計算する関数を取得します。このソリューションの2番目の部分では、この関数を正しい回数だけ繰り返し処理します。

、3バイト

←↓¡

¡ 「iterate」関数です。関数と開始点を取り、関数を反復して取得した値の無限リストを返します。

数値(このチャレンジの3番目の引数)を取り、リストの先頭からその数の要素を削除します。

結果リストの最初の要素を返します。



3

ルビー、42バイト

->c,n,x{n.times{x=c.reduce{|s,r|s*x+r}};x}

Cは、降順の係数のリストです

自明なバージョン。fはラムダ関数(26バイト)です。

->f,n,x{n.times{x=f[x]};x}

# For example:
# g=->f,n,x{n.times{x=f[x]};x}
# p g[->x{0.02*x**4-0.01*x**2-0.05},100,0.1]

オンラインでお試しください!


3

JavaScript(ES6)、 52 49 44  42バイト

GBのおかげで5バイト、Neilのおかげでさらに2 バイト節約

カリー化構文で入力を受け取ります(p)(n)(x)。ここで、pは係数の降順のリストです。

p=>n=>g=x=>n--?g(p.reduce((s,v)=>s*x+v)):x

テストケース


pが降順の場合、s * x + vを使用して縮小し、iを無視できます。
GB

その場合、,0reduce を省略できますか?
ニール

@ニール良いキャッチ。:
アーナルド

2

J、15バイト

0{(p.{.)^:(]{:)

オンラインでお試しください!

多項式を昇べきの係数のリストとして受け取ります。

説明

0{(p.{.)^:(]{:)  Input: polynomial P (LHS), [x, n] (RHS)
            {:   Tail of [x, n], gets n
           ]     Right identity, passes n
  (    )^:       Repeat n times starting with g = [x, n]
     {.            Head of g
   p.              Evaluate P at that value
                   Return g = [P(head(g))]
0{               Return the value at index 0

2

05AB1E10 9バイト

Erik the Outgolferのおかげで-1バイト

sF³gݨm*O

オンラインでお試しください!

xを最初の引数、nを2番目、pを3番目に昇順で受け取ります。

説明

sF³gݨm*O
s         # Forces the top two input arguments to get pushed and swaped on the stack
 F        # Do n times...
  ³        # Push the third input (the coefficients)
   g       # Get the length of that array...
    ݨ     # and create the range [0 ... length]
      m    # Take the result of the last iteration to these powers (it's just x for the first iteration)
       *   # Multiply the resuling array with the corresponding coefficients
         O # Sum the contents of the array
          # Implicit print

1
2番目を削除でき³ます。
エリックアウトゴルファー

また(This is in case n is 0 so x is on the stack)s0以外のn が必要です。
エリックアウトゴルファー

ええ、それは本当です。私は¹².with を置換する行に沿ってもっと考えていたsので、少なくとも1回ループする必要なく、1バイトでxをスタックにプッシュするジョブを取得します。おそらく、より良いことを言うべきだった^^ '。また、-1に感謝します!
ダトボイ

05AB1Eは、すべての入力が読み取られた場合、暗黙的な入力に最後の入力を使用するため、まだ必要であることを意味しました。
エリックアウトゴルファー

sF³gݨm³O」とあまりにも説明で...
エリックOutgolfer

2

Haskell、15バイト

((!!).).iterate

オンラインでお試しください!

両方のソリューションから11バイトの完全な人間のおかげで

これは、関数を最初の引数およびn2番目の引数として受け取り、その関数をそれ自体のn時間で構成する暗黙の関数を定義します。次に、これを引数で呼び出してx最終値を取得できます。カリー化の魔法のおかげで、これは3つの引数を取る1つの関数に相当します。


関数の引数の代わりに係数のリストを取る:

Haskell、53バ​​イト

((!!).).iterate.(\p x->sum$zipWith(*)p[x^i|i<-[0..]])

オンラインでお試しください!

これは上記のコードと同じですが、係数のリストを多項式関数に変換するラムダ関数で構成されています。係数は、例の逆順で取得されxます。



二つ目のTIOは、引数ではなく、関数としてリストを取る必要があります;)あなたのような折り目を使用してバイトの一握りを保存することができますが、この(注をゼロ多項式缶ではないこと[]が、のようなものでなければなりません[0]または類似)。
ბიმო

2

APL(Dyalog)20 9バイト

{⊥∘⍵⍣⎕⊢⍺}

オンラインでお試しください!

これはx、左引数として、関数の係数を右引数として、そしてn STDINから取得します。

これを何度も振り返ってみると、ベース変換を使用することで計算を簡素化できることに気付きました


APL(Dyalog)、5バイト

関数をDyalog APL関数として使用できる場合、これは5バイトになります。

⎕⍣⎕⊢⎕

取りxnそしてSTDINからの入力のように機能します。


2

R96 58 55 52バイト

f=function(n,p,x)`if`(n,f(n-1,p,x^(seq(p)-1)%*%p),x)

オンラインでお試しください!

説明:

seq(p)がベクトルである1, 2, ..., length(p)場合、リストが生成されるpためseq(p)-1、多項式の指数x^(seq(p)-1)も同じであるため、x^0(常に1に等しい), x^1, x^2, ...と同等で、ドット積%*%を計算しpて多項式を評価しますxます。

さらに、Pが関数として使用される場合、これは38バイトになります。

function(n,P,x)`if`(n,f(n-1,P,P(x)),x)

そして、我々はもちろん、常に生成することができますPP=function(a)function(x)sum(x^(seq(a)-1)*a)




1

C#(.NET Core)、82バイト

using System.Linq;f=(p,n,x)=>n<1?x:p.Select((c,i)=>c*Math.Pow(f(p,n-1,x),i)).Sum()

オンラインでお試しください!

配列内のインデックスがxを累乗するべき乗数に等しくなるように、テストケースとは逆の順序(増加する順序?)で係数のリストを取得します。

そして、30バイトの簡単なバージョン:

f=(p,n,x)=>n<1?x:f(p,n-1,p(x))

オンラインでお試しください!

デリゲートを取得し、n回再帰的に適用します。



1

ジュリア0.6.0(78バイト)

using Polynomials;g(a,n,x)=(p=Poly(a);(n>0&&(return g(a,n-1,p(x)))||return x))

説明:

パッケージPolynomialsは自明です:多項式を作成します。その後、それはかなり基本的な再帰です。

多項式を得るには、-4.0-2.3 * x + 0.1 * x ^ 2のaように入力する必要がありますa = [-4, -2.3, 0.1]


1

公理、91バイト

f(n,g,x)==(for i in 1..n repeat(v:=1;r:=0;for j in 1..#g repeat(r:=r+v*g.j;v:=v*x);x:=r);x)

くぼんだ

fn(n,g,x)==
     for i in 1..n repeat
          v:=1; r:=0
          for j in 1..#g repeat(r:=r+v*g.j;v:=v*x)
          x:=r
     x

ポリノミーgの入力は、運動の例の逆の数字のリストです。例えば

[1,2,3,4,5]  

それはポリノミーを表すでしょう

1+2*x+3*x^2+4*x^3+5*x^4

テスト:

(3) -> f(0,[0,0,1],3)
   (3)  3
                                                    Type: PositiveInteger
(4) -> f(1,[0,0,1],3)
   (4)  9
                                                    Type: PositiveInteger
(5) -> f(0,[-4,-2.30,0.1],2.3)
   (5)  2.3
                                                              Type: Float
(6) -> f(1,[-4,-2.30,0.1],2.3)
   (6)  - 8.7610000000 000000001
                                                              Type: Float
(7) -> f(2,[-4,-2.30,0.1],2.3)
   (7)  23.8258121
                                                              Type: Float
(8) -> f(9,[-4,-2.30,0.1],2.3)
   (8)  211.3326335688 2052491
                                                              Type: Float
(9) -> f(9,[-4,-2.30,0.1,0,0,0,0,1],2.3)
   (9)  0.4224800431 1790652974 E 14531759
                                                              Type: Float
                                   Time: 0.03 (EV) + 0.12 (OT) = 0.15 sec
(10) -> f(2,[-4,-2.30,0.1,0,0,0,0,1],2.3)
   (10)  44199336 8495528344.36
                                                              Type: Float


1

C ++ 14、71バイト

一般的な名前のないラムダとして、xパラメータを介して返します:

[](auto C,int n,auto&x){for(auto t=x;t=0,n--;x=t)for(auto a:C)t=a+x*t;}

ゴルファーなしとテストケース:

#include<iostream>
#include<vector>

using namespace std;

auto f=
[](auto C,int n,auto&x){
 for(
  auto t=x; //init temporary to same type as x
  t=0, n--; //=0 at loop start, also check n
  x=t       //apply the result
  )
  for(auto a:C)
   t=a+x*t; //Horner-Scheme
}
;


int main() {
 vector<double> C = {0.1,-2.3,-4};//{1,0,0};
 for (int i = 0; i < 10; ++i) {
  double x=2.3;
  f(C, i, x);
  cout << i << ": " << x << endl;
 }
}

0

QBIC、19バイト

[:|:=:*c^2+:*c+:}?c

入力を取ります

  • 反復回数
  • xの開始値
  • 次に、多項式の3つの部分

サンプル出力:

Command line: 8 2.3 0.1 -2.3 -4
 59.30772

0

Clojure、66バイト

#(nth(iterate(fn[v](apply +(map *(iterate(partial * v)1)%3)))%2)%)

完全な例:

(def f #(nth(iterate(fn[v](apply +(map *(iterate(partial * v)1)%3)))%2)%))
(f 10 2.3 [-4 -2.3 0.1])
; 3976.0831439050253

関数の構成は26バイトです:

#(apply comp(repeat % %2))

(def f #(apply comp(repeat % %2)))
((f 10 #(apply + (map * [-4 -2.3 0.1] (iterate (partial * %) 1)))) 2.3)
; 3976.0831439050253

0

Japt、18バイト

非常に簡単で、課題が錫について述べていることを行います。

o r_VË*ZpVÊ-EÉÃx}W
o                  // Take `n` and turn it into a range [0,n).
  r_            }W // Reduce over the range with initial value of `x`.
    VË             // On each iteration, map over `p`, yielding the item
      *Z           // times the current reduced value
        pVÊ-EÉ     // to the correct power,
              Ãx   // returning the sum of the results.

順番に入力を取りnpx

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.