新しく発言する  EXIT  インデックスへ

多項式展開


  多項式展開 しばっち 2008/03/22 21:42:39  (修正1回)
  係数が指定できると 島村1243 2008/03/23 08:57:56 
  │└返事 しばっち 2008/03/23 09:52:22 
  │ └失礼しました 島村1243 2008/03/23 13:43:12  (修正1回)
  !多変数多項式の演算(加減乗算) 山中和義 2008/03/23 21:13:46 
   └つづき 山中和義 2008/03/23 21:14:43 
    └つづき 山中和義 2008/03/23 21:17:07 

  多項式展開 しばっち 2008/03/22 21:42:39  (修正1回)  ツリーへ
多項式展開  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/22 21:42:39 ** この記事は1回修正されてます
OPTION BASE 0
INPUT PROMPT "項数(2<=NN<=26) NN=":NN
LET MAXLEVEL=6
DIM A(NN)
PUBLIC NUMERIC PARA(26)
FOR I=1 TO NN
LET PARA(I)=I !'係数
NEXT I
FOR N=2 TO MAXLEVEL
CALL DISPLAYN(PARA,NN)
PRINT "^";STR$(N)
LET K$=""
CALL COMBDISPLAYRECURSIVE(0,NN,N,A,K$)
IF LEFT$(K$,1)="+" THEN LET K$=RIGHT$(K$,LEN(K$)-1)
PRINT K$
NEXT N
END

EXTERNAL SUB DISPLAYN(A(),N)
PRINT "(";
IF A(1)<0 THEN PRINT "-";
IF ABS(A(1))=1 THEN
PRINT "a";
ELSEIF A(1)<>0 THEN
PRINT STR$(ABS(A(1)));"a";
END IF
FOR I=2 TO N
IF A(I)<0 THEN PRINT "-"; ELSE PRINT "+";
IF ABS(A(I))=1 THEN
PRINT MID$("abcdefghijklmnopqrstuvwxyz",I,1);
ELSEIF A(I)<>0 THEN
PRINT STR$(ABS(A(I)));MID$("abcdefghijklmnopqrstuvwxyz",I,1);
END IF
NEXT I
PRINT ")";
END SUB

EXTERNAL SUB COMBDISPLAYRECURSIVE(NN,N,M,A(),K$)
IF NN=N THEN
LET S=M
FOR J=0 TO NN
LET S=S-A(J)
NEXT J
IF S=0 THEN
LET V=FAC(M)
FOR J=0 TO N-1
LET V=V*PARA(J+1)^A(J)/FAC(A(J)) !'多項定理
NEXT J
IF V<0 THEN
LET L$="-"
ELSE
LET L$="+"
END IF
IF V<>0 THEN
IF ABS(V)<>1 THEN LET L$=L$ & STR$(ABS(V))
FOR J=0 TO N-1
IF A(J)=1 THEN
LET L$=L$ & MID$("abcdefghijklmnopqrstuvwxyz",J+1,1)
ELSEIF A(J)>1 THEN
LET L$=L$ & MID$("abcdefghijklmnopqrstuvwxyz",J+1,1) & "^" & STR$(A(J))
END IF
NEXT J
LET K$=L$ & K$
END IF
END IF
EXIT SUB
END IF
FOR I=0 TO M
LET A(NN)=I
CALL COMBDISPLAYRECURSIVE(NN+1,N,M,A,K$)
NEXT I
END SUB

EXTERNAL FUNCTION FAC(X)
LET S=1
FOR I=2 TO X
LET S=S*I
NEXT I
LET FAC=S
END FUNCTION
  係数が指定できると 島村1243 2008/03/23 08:57:56   ツリーへ
Re: 多項式展開  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/03/23 08:57:56
係数が指定できると

入力ダイアログでNN=4を入力すると
(a+2b+3c+4d)についての2乗〜6乗迄の展開式がプリン
トされました。
このabc...の各係数はNN値で決まってしまうようですが、
abc...の各係数を指定できる様にして頂けると実用性が
広がると思います。


  │└返事 しばっち 2008/03/23 09:52:22   ツリーへ
Re: 係数が指定できると  返事を書く  ノートメニュー
しばっち <dihjvcfsyu> 2008/03/23 09:52:22
返事


配列変数PARAで係数を設定しています。
係数を変えるには、この配列変数PARAを変更してください。
変数NNは項目数の指定です。
説明不足ですみません。



  │ └失礼しました 島村1243 2008/03/23 13:43:12  (修正1回)  ツリーへ
Re: 返事  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/03/23 13:43:12 ** この記事は1回修正されてます
失礼しました

しばっちさん、ご回答有難うございました。
私こそコードの読み不足で申し訳有りませんでした。

PUBLIC NUMERIC PARA(26)の下の次の3行

FOR I=1 TO NN
LET PARA(I)=I !'係数
NEXT I

を以下のように変更

FOR I=1 TO NN
msg$=str$(I) & "番目の係数は?"
input prompt msg$:k
LET PARA(I)=k !'係数
NEXT I
PRINT

して目的達成しました。
  !多変数多項式の演算(加減乗算) 山中和義 2008/03/23 21:13:46   ツリーへ
Re: 多項式展開  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/03/23 21:13:46
!多変数多項式の演算(加減乗算)

OPTION BASE 0

!マクロ
DEF GetVal(p$)=VAL(p$(N+2:LEN(p$))) !係数を得る
DEF GetDegree$(p$)=p$(1:N) !次数を得る

SUB PolyCopy(p$(), q$()) !コピーする
FOR i=1 TO VAL(p$(0))
LET q$(i)=p$(i) !係数、次数
NEXT i
LET q$(0)=p$(0) !項の数
END SUB

SUB PolySimple(r$()) !同類項をまとめる
LET k=VAL(r$(0))
FOR i=1 TO k-1 !※組み合わせで考える
LET ri$=GetDegree$(r$(i)) !次数
LET t=GetVal(r$(i)) !係数
IF t<>0 THEN !0を除く
FOR j=i+1 TO k
LET rj$=GetDegree$(r$(j)) !次数
IF ri$=rj$ THEN !同類項なら
LET t=t+GetVal(r$(j)) !前方へ吸収する
LET r$(j)(N+2:LEN(r$(j)))="0" !削除する
END IF
NEXT j
LET r$(i)=ri$ & ":" & STR$(t) !まとめる
END IF
NEXT i
!MAT PRINT r$ !debug

LET j=0 !削除する項の数
FOR i=1 TO k !係数が0の項を削除する
IF j>0 THEN LET r$(i-j)=r$(i)
IF GetVal(r$(i))=0 THEN LET j=j+1
NEXT i
LET k=k-j

LET r$(0)=STR$(k) !項の数
END SUB


!表示関連
SUB PolyDisplay(p$()) !多変数多項式を表示する
IF VAL(p$(0))=0 THEN
PRINT "0";
ELSE
FOR i=1 TO VAL(p$(0)) !各項について
LET t=GetVal(p$(i)) !係数の部
IF t<>0 THEN !0は非表示
IF i>1 THEN !最初の項を除く
IF t>0 THEN PRINT "+"; ELSE PRINT "-"; !符号
END IF
LET t=ABS(t)
IF t<>1 THEN PRINT STR$(t); !1は非表示

FOR j=1 TO N !変数の次数の部
IF p$(i)(j:j)<>"0" THEN !0乗は非表示
PRINT CHR$(j-1+ORD("a")); !変数 abcd … xyz
IF p$(i)(j:j)<>"1" THEN PRINT "^";p$(i)(j:j); !1乗は非表示
END IF
NEXT j

IF VAL(GetDegree$(p$(i)))=0 AND t=1 THEN PRINT "1";
END IF
NEXT i
END IF
END SUB
   └つづき 山中和義 2008/03/23 21:14:43   ツリーへ
Re: !多変数多項式の演算(加減乗算)  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/03/23 21:14:43
つづき



!演算関連
SUB PolyAdd(p$(),q$(), r$()) !加算 r=p+q
LET k=VAL(p$(0))
FOR i=1 TO k
LET r$(i)=p$(i)
NEXT i
FOR i=1 TO VAL(q$(0))
LET r$(k+i)=q$(i)
NEXT i
LET k=k+VAL(q$(0))
LET r$(0)=STR$(k) !項の数

CALL PolySimple(r$) !同類項をまとめる
END SUB

SUB PolySub(p$(),q$(), r$()) !減算 r=p-q
DIM qq$(500)
FOR i=1 TO VAL(q$(0)) !係数の符号を反転させる
LET qq$(i)=q$(i)
LET qq$(i)(N+2:LEN(qq$(i)))=STR$(-GetVal(q$(i)))
NEXT i
LET qq$(0)=q$(0) !項の数
!MAT PRINT qq$ !debug

CALL PolyAdd(p$,qq$, r$) !r=p+(-q)
END SUB

SUB PolyMul(p$(),q$(), r$()) !乗算 r=p*q
LET k=0
FOR i=1 TO VAL(p$(0))
FOR j=1 TO VAL(q$(0))
LET k=k+1 !項と項をかける
LET t$=""
FOR e=1 TO N
LET t$=t$ & STR$( VAL(p$(i)(e:e)) + VAL(q$(j)(e:e)) ) !次数
NEXT e
LET r$(k)=t$ & ":" & STR$(GetVal(p$(i)) * GetVal(q$(j))) !係数
NEXT j
NEXT i
LET r$(0)=STR$(k) !項の数
!MAT PRINT r$ !debug

CALL PolySimple(r$) !同類項をまとめる
END SUB
!------------------------------ ここまでがサブルーチン

    └つづき 山中和義 2008/03/23 21:17:07   ツリーへ
Re: つづき  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/03/23 21:17:07
つづき



LET N=26 !変数の数

DIM p$(500) !p=a+b+c
LET p$(0)="3" !項の数
!     "abcdefghijklmnopqrstuvwxyz:係数"
LET p$(1)="10000000000000000000000000:1" !a
LET p$(2)="01000000000000000000000000:1" !b
LET p$(3)="00100000000000000000000000:1" !c

DIM q$(500) !q=1
LET q$(0)="1"
LET q$(1)="00000000000000000000000000:1" !1 ※定数項


DIM r$(500)
!CALL PolySub(p$,q$, r$)
!MAT PRINT p$
!MAT PRINT q$
!MAT PRINT r$
!CALL PolyDisplay(r$)
!PRINT

FOR x=1 TO 9 !べき乗の計算
PRINT "(";
CALL PolyDisplay(p$)
PRINT ")^";STR$(x)

CALL PolyMul(p$,q$, r$)
CALL PolyDisplay(r$) !結果を表示
PRINT

CALL PolyCopy(r$, q$) !次へ
NEXT x


END

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。