Division Algorithm version.2(多変数リスト Lex Order採用 version)のプログラム In[1]:=PolyDiv2[f_,g_]:=PolyDiv2[f,g]=Module[{s,a,r,p,i,c,h1,h2}, s=Length[g];a={};Do[a=Append[a,{}],{s}];r={};p=f; While[p=!={},i=1;c=True; While[i<=s&&c,h1=LT2[p][[2]]-LT2[g[[i]]][[2]]; If[Select[h1,#1<0&]=={}, h2=LT2[p][[1]]/(LT2[g[[i]]][[1]]); a=ReplacePart[a,Polymono2[a[[i]],{h2,h1}],i];gg=g[[i]]; While[gg=!={},p=Polymono2[p,{-h2*LT2[gg][[1]], h1+LT2[gg][[2]]}];gg=Polymono2[gg,{-LT2[gg][[1]], LT2[gg][[2]]}]];c=False,i=i+1]]; If[c,r=Polymono2[r,LT2[p]]; p=Polymono2[p,{-LT2[p][[1]],LT2[p][[2]]}]]];{a,r}] 但し、 LT2[f_]:=LT2[f]=Module[{s,lt,a}, s=Length[f];lt=f[[1]]; Do[If[DeleteCases[lt[[2]]-f[[a]][[2]],0][[1]]<0, lt=f[[a]]],{a,2,s}];lt] Polymono2[f_,m_]:=Polymono2[f,m]=Module[{ff,s,c,a}, ff=f;s=Length[ff];If[s==0,ff={m},c=True;a=1; While[c,If[DeleteCases[m[[2]]-ff[[a]][[2]],0]=={}, ff=ReplacePart[ff,{ff[[a]][[1]]+m[[1]],m[[2]]},a]; If[ff[[a]][[1]]==0,ff=Delete[ff,a]];c=False,a=a+1]; If[a==s+1,ff=Append[ff,m];c=False]]];ff] PolyDiv2[f, {f1, f2, ..., fn}]と入力すると、 {{a1, a2, ..., an}, r}を出力します。 但し、f, f1, f2, ..., fn, a1, a2, ..., an, r は、リストで表した多項式で、Lex Orderを採用し、fをf1, f2, ..., fn という順番で割っていったときのそれぞれの商が、a1, a2, ..., an で、余りが、r です。 ( i.e. f=a1*f1+a2*f2+・・・+an*fn+r を満たしている。) (Example) In[2]:=PolyDiv2[{{1,{2,1}},{1,{1,2}},{1,{0,2}}},{{{1,{1,1}},{-1,{0,0}}}, {{1,{0,2}},{-1,{0,0}}}}] Out[2]={{{{1,{1,0}},{1,{0,1}}},{{1,{0,0}}}},{{1,{1,0}},{1,{0,1}},{1,{0,0}}}}