多項式の展開

 投稿者:永野護  投稿日:2010年 9月 8日(水)17時52分9秒
  (2x^4  +  5x^3  +  3x^2  +  6x  +  7)^5という多項式を展開したとき各次数のxの係数を計算するにはどうすればよいのでしょうか。また以上のことを一般化して任意のxについての多項式のべき乗を展開したときに現れるxの各次数の係数を出力するプログラムを十進BASICでかくとどのようなものになるのでしょうか。  

Re: 多項式の展開

 投稿者:山中和義  投稿日:2010年 9月 8日(水)19時28分34秒
  > No.1381[元記事へ]

永野護さんへのお返事です。

配列A()のN番目の要素を、べき乗x^Nの係数に割り当てる。
多項式 A(N)*x^N + A(N-1)*x^(N-1) + … +A(3)*x^3 +A(2)*x^2 +A(1)*x^1 +A(0)*x^0 となる。
べき乗は、1にN回かけることで計算する(効率は悪い)
LET N=4 !最高次数
LET M=5 !べき乗数

DIM P(0 TO M*N)
MAT P=ZER !定数1
LET P(0)=1
LET PP=0 !次数

DIM Q(0 TO N)
DATA 2,5,3,6,7 !Q(x)=2*x^4+5*x^3+3*x^2+6*x+7
FOR i=N TO 0 STEP -1
   READ Q(i)
NEXT i

FOR i=1 TO M !Q(x)^M !多項式 (2*x^4+5*x^3+3*x^2+6*x+7)^5 を展開する
   CALL PolyMul(PP,P,N,Q, PP,P)
NEXT i

FOR i=M*N TO 0 STEP -1
   PRINT P(i);
NEXT i
PRINT

END


EXTERNAL SUB PolyMul(AA,A(),BB,B(), CC,C()) !1変数多項式の乗算 C=A*B
DIM W(0 TO AA+BB) !作業用
MAT W=ZER
FOR i=0 TO AA !最高次数まで
   FOR j=0 TO BB
      LET W(i+j)=W(i+j)+A(i)*B(j) !※筆算参照
   NEXT j
NEXT i
LET CC=AA+BB !copy it
MAT C=W
END SUB
 

多項式の展開

 投稿者:永野護  投稿日:2010年 9月 9日(木)11時19分11秒
  山中様、お忙しい中、丁寧な回答ありがとうございました。参考にさせていただきます。
残暑が厳しいですがお体をご大切に。
 

Re: 多項式の展開

 投稿者:山中和義  投稿日:2010年 9月 9日(木)21時02分25秒
  > No.1381[元記事へ]

永野護さんへのお返事です。

別解 多項定理
PUBLIC NUMERIC N
LET N=4 !次数 ※
LET P=5 !べき乗数 ※

PUBLIC NUMERIC B(0 TO 100) !展開した多項式

DIM A(N+1) !{p,q,r,s,t}の並び
CALL IntegerPartition(P,N+1,1, A)

FOR i=N*P TO 0 STEP -1
   PRINT B(i);"* x ^";i
NEXT i
PRINT

END


!多項定理
! (2*x^4+5*x^3+3*x^2+6*x+7)^5 の展開
! FACT(p+q+r+s+t)/(FACT(p)*FACT(q)*FACT(r)*FACT(s)*FACT(t)) * (2*x^4)^p * (5*x^3)^q * (3*x^2)^r * (6*x)^s * (7)^t

EXTERNAL SUB PolyExpand(A(),P) !多項式の展開に多項定理を当てはめる
DIM Q(0 TO N)
DATA 2,5,3,6,7 !2*x^4+5*x^3+3*x^2+6*x+7 ※
FOR i=N TO 0 STEP -1
   READ Q(i)
NEXT i

LET w=1 !(p! * q! * r! * s! * t!)の計算
FOR i=1 TO N+1
   LET w=w*FACT(A(i))
NEXT i

LET c=FACT(P)/w !前半部分 (p+q+r+s+t)!/(p! * q! * r! * s! * t!)

LET x=0 !後半部分を加味する
FOR i=1 TO N+1
   LET c=c*Q(i-1)^A(i) !係数
   LET x=x+(i-1)*A(i) !べき乗
NEXT i

LET B(x)=B(x)+c !記録する
END SUB


EXTERNAL SUB IntegerPartition(n,d,s, A()) !自然数nをd分割する
IF d=1 THEN
   LET A(s)=n
   MAT PRINT A;
   CALL PolyExpand(A,s) !多項式を展開する
ELSEIF d>1 THEN
   FOR i=0 TO n
      LET A(s)=n-i
      CALL IntegerPartition(i,d-1,s+1, A)
   NEXT i
END IF
END SUB
 

多項式の展開

 投稿者:永野護  投稿日:2010年 9月10日(金)10時08分59秒
  山中様へ
たびたびのご回答に感謝します。丁寧なプログラムありがとうございました。
大変参考になりました。
 

戻る