多項式受容


22

f,g整数に対する任意の次数の2つの多項式が与えられた場合、プログラム/関数は2番目の多項式の最初の多項式を評価する必要があります。f(g(x))(別名組成物 (fog)(x) 2つの多項式の)

詳細

組み込みが許可されます。入出力として適切なフォーマットを想定できますが、入力と出力のフォーマットは一致する必要があります。例えば、文字列としてのフォーマット

x^2+3x+5

または係数のリストとして:

[1,3,5] or alternatively [5,3,1]

さらに、入力多項式は完全に拡張されると想定でき、出力も完全に拡張されると予想されます。

A(x) = x^2 + 3x + 5, B(y) = y+1
A(B(y)) = (y+1)^2 + 3(y+1) + 5 = y^2 + 5y + 9

A(x) = x^6 + x^2 + 1, B(y) = y^2 - y
A(B(y))= y^12 - 6y^11 + 15y^10 - 20y^9 + 15y^8 - 6y^7 + y^6 + y^4 - 2 y^3 + y^2 + 1

A(x) = 24x^3 - 144x^2 + 288x - 192, B(y) = y + 2
A(B(y)) = 24y^3

A(x) = 3x^4 - 36x^3 + 138x^2 - 180x + 27, B(y) = 2y + 3
A(B(y)) = 48y^4 - 96y^2

ビルトインはどうですか?
マルティセン

1
@Maltysen 「詳細:組み込みが許可されています。(...)」 :D
flawr

2
「任意の合理的なフォーマット」は少し伸縮可能だと思います。多項式を評価する関数が許可されている場合、合成関数(.)はHaskellの答えです。おそらく係数のリストの何らかの表現を意味します。
xnor

1
タイトル!私はちょうどそれが:-Dだ
ルイスMendo

2
@LuisMendoクイック思考= P
flawr

回答:


10

Haskell、86 72バイト

u!c=foldr1((.u).zipWith(+).(++[0,0..])).map c
o g=(0:)!((<$>g).(*))!pure

合成f∘g oo g f計算するような関数を定義します。多項式は、定数項から始まる係数の空でないリストで表されます。

デモ

*Main> o [1,1] [5,3,1]
[9,5,1]
*Main> o [0,-1,1] [1,0,1,0,0,0,1]
[1,0,1,-2,1,0,1,-6,15,-20,15,-6,1]
*Main> o [2,1] [-192,288,-144,24]
[0,0,0,24]
*Main> o [3,2] [27,-180,138,-36,3]
[0,0,-96,0,48]

使い方

多項式関連のビルトインまたはライブラリはありません。同様の繰り返しを観察する

f(x)= a +f₁(x)x⇒f(x)g(x)= ag(x)+f₁(x)g(x)x、
f(x)= a +f₁(x)x⇒ f(g(x))= a +f₁(g(x))g(x)、

それぞれ多項式の乗算と合成用。彼らは両方の形を取ります

f(x)= a +f₁(x)x⇒W(f)(x)= C(a)(x)+ U(W(f₁))(x)

演算子は、多項式の加算!に使用zipWith(+).(++[0,0..])して、UとCが与えられたWに対するこの形式の繰り返しを解決します(2番目の引数が長いと仮定します。目的のために、常にそうなります)。その後、

(0:)多項式の引数にxを乗算します(ゼロの係数を前に付けます)。
(<$>g).(*)スカラー引数に多項式を乗算しgます。
(0:)!((<$>g).(*))多項式の引数に多項式を乗算しgます。
pureスカラー引数を定数多項式(シングルトンリスト)に変換します。
(0:)!((<$>g).(*))!pure多項式で多項式引数を作成しgます。


9

Mathematica、17バイト

Expand[#/.x->#2]&

使用例:

In[17]:= Expand[#/.x->#2]& [27 - 180x + 138x^2 - 36x^3 + 3x^4, 3 + 2x]

              2       4
Out[17]= -96 x  + 48 x

7

TI-Basic 68k、12バイト

a|x=b→f(a,b)

最初の例のように、使い方は簡単です:

f(x^2+3x+5,y+1)

どっちが

y^2+5y+9

入力が異なる変数であることを要求するのは私にはごまかしているように思えます。この答えは重要ですか?
-feersum

気軽に入力してください。妥当な便利な入力形式を明示的に許可しました。
-flawr

あなたのコメントの編集に関して:はい、それは重要です。
-flawr

私はこのサイトのルールにあまり詳しくありません。TI-BASICで1バイトであることは正しいですか?
asmeurer

@asmeurer実際:TI-Basicは、対応する計算機で使用されているエンコーディングによってスコアリングされます。詳細に興味がある場合は、metaこちらを読むことができます。トークンの表は、ti-basic-devにあります。
-flawr

6

Python 2、138156162バイト

入力は、最初に最小のべき乗を持つ整数リストであることが期待されます。

def c(a,b):
 g=lambda p,q:q>[]and q[0]+p*g(p,q[1:]);B=99**len(`a+b`);s=g(g(B,b),a);o=[]
 while s:o+=(s+B/2)%B-B/2,;s=(s-o[-1])/B
 return o

ゴルフをしていない:

def c(a,b):
 B=sum(map(abs,a+b))**len(a+b)**2
 w=sum(B**i*x for i,x in enumerate(b))
 s=sum(w**i*x for i,x in enumerate(a))
 o=[]
 while s:o+=min(s%B,s%B-B,key=abs),; s=(s-o[-1])/B
 return o

この計算では、多項式係数は、非常に大きな基数の数字(負の場合もある)として表示されます。多項式がこの形式になると、乗算または加算は単一の整数演算になります。ベースが十分に大きい限り、隣接する桁に波及するキャリーはありません。

-18 Bは、@ xnorが示唆するように、バウンドオンの改善から。


いい方法。以下のためにB、でしょう10**len(`a+b`)十分では?
xnor

@xnorたぶん...言うのは難しいです。
feersum

+1これは本当に創造的なソリューションであり、bigintをうまく使用しています!!!
flawr

@xnorこれで、係数の長さは入力長で線形であると確信できました:)
feersum

5

Python + SymPy、59 35バイト

from sympy import*
var('x')
compose

24バイトのゴルフをしてくれた@asmeurerに感謝します!

試運転

>>> from sympy import*
>>> var('x')
x
>>> f = compose
>>> f(x**2 + 3*x + 5, x + 1)
x**2 + 5*x + 9

1
SymPyにはcompose()機能があります。
asmeurer

1
答えはどこですか?もはや機能を定義したり、何かをしたりしません
...-feersum

1
@feersumそんなことはありませんでした。そのメタ投稿を編集しました。
メゴ

3
@feersum受け入れられたメタ投稿を編集して、独自の議題のポリシーを変更しました。それは大丈夫ではありません。
メゴ

3
@feersumあなたの言葉遣いは曖昧だと思っていたかもしれませんが、それは明らかにコミュニティの他の人々のためではありませんでした。from module import*;function有効な提出であるコンセンサスを受け入れました。とにかく、これはより新しいポリシーであり、名前のないラムダを使用したインポートおよびヘルパー関数を許可します。
メゴ

3

セージ、24バイト

lambda A,B:A(B).expand()

Sage 6.9(http://sagecell.sagemath.orgで実行されるバージョン)以降、明示的な引数割り当て(f(2) rather than f(x=2))なしの関数呼び出しにより、迷惑で役に立たないメッセージがSTDERRに出力されます。コードゴルフではSTDERRはデフォルトで無視できるため、これはまだ有効です。

これは、Sageがa)Pythonで構築されており、b)を使用しているため、DennisのSymPyの回答に非常に似ています多くの点でSymPyと非常によく似たコンピューター代数システムであるMaximaをに非常に似ています。ただし、SageはPythonとSymPyを併用するよりもはるかに強力であるため、独自の答えに値するほど十分に異なる言語です。

すべてのテストケースをオンラインで検証する


2

PARI / GP、19バイト

(a,b)->subst(a,x,b)

あなたにできること

%(x^2+1,x^2+x-1)

取得するため

%2 = x ^ 4 + 2 * x ^ 3-x ^ 2-2 * x + 2


1

Symbolic Toolboxを使用したMATLAB、28バイト

@(f,g)collect(subs(f,'x',g))

これは匿名関数です。呼び出すには、変数に割り当てるか、を使用しますans。入力は次の形式の文字列です(スペースはオプションです)

x^2 + 3*x + 5

実行例:

>> @(f,g)collect(subs(f,'x',g))
ans = 
    @(f,g)collect(subs(f,'x',g))
>> ans('3*x^4 - 36*x^3 + 138*x^2 - 180*x + 27','2*x + 3')
ans =
48*x^4 - 96*x^2

1

Python 2、239 232 223バイト

r=range
e=reduce
a=lambda*l:map(lambda x,y:(x or 0)+(y or 0),*l)
m=lambda p,q:[sum((p+k*[0])[i]*(q+k*[0])[k-i]for i in r(k+1))for k in r(len(p+q)-1)]
o=lambda f,g:e(a,[e(m,[[c]]+[g]*k)for k,c in enumerate(f)])

ベースを乱用しない「適切な」実装。最下位係数が最初。

aは多項式の加算、m多項式の乗算、およびo合成です。


m([c],e(m,[[1]]+[g]*k))と同じではありませんe(m,[[c]]+[g]*k)か?
ニール

@Neilいいね、それで2つをつぶすことができます!
orlp

a=lambda*l:map(lambda x,y:(x or 0)+(y or 0),*l)
アンデルスカセオルグ

@AndersKaseorg右、私はそれを追加しました、ありがとう:)
orlp

1つのリストは常に他のリストよりも長いため( or 0)、そのバージョンでは必要ないため、多項式の加算を単純化することが可能かもしれません。
ニール

1

JavaScript(ES6)、150 103バイト

(f,g)=>f.map(n=>r=p.map((m,i)=>(g.map((n,j)=>p[j+=i]=m*n+(p[j]||0)),m*n+(r[i]||0)),p=[]),r=[],p=[1])&&r

0 + a 1 * x + a 2 * x 2を表す配列a = [a 0、a 1、a 2、...] として多項式を受け入れ、返します ...。

編集:再帰的から反復多項式乗算に切り替えることで47バイトを保存しました。 map呼び出し。

説明:rは空の配列で表されるゼロから始まる結果であり、pは1から始まるg hです。pにf hが順に乗算され、結果がrに累積されます。また、pには同時にgが乗算されます。

(f,g)=>f.map(n=>            Loop through each term of f (n = f[h])
 r=p.map((m,i)=>(           Loop through each term of p (m = p[i])
  g.map((n,j)=>             Loop though each term of g (n = g[j])
   p[j+=i]=m*n+(p[j]||0)),  Accumulate p*g in p
  m*n+(r[i]||0)),           Meanwhile add p[i]*f[h] to r[i]
  p=[]),                    Reset p to 0 each loop to calculate p*g
 r=[],                      Initialise r to 0
 p=[1]                      Initialise p to 1
)&&r                        Return the result


1

Ruby 2.4 + 多項式、41 + 12 = 53バイト

flagを使用します-rpolynomial。入力は2つのPolynomialオブジェクトです。

誰かがバニラルビー(多項式外部ライブラリなし)で私を凌gしている場合、私は非常に感銘を受けます。

->a,b{i=-1;a.coefs.map{|c|c*b**i+=1}.sum}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.