Kodama's home / tips.

Ruby Polynomial class(Polynomial,RationalPoly,PolynomialM,RationalPolyM,Number)

Download: poly-ruby.*.tar.gz.
See also Ruby and Ruby Application Archives.

Example

Script:
#!/usr/local/bin/ruby

require "polynomial"

f=Poly("(2x+1)(x^3-1)^2")
g=Poly("7x^2+6x+5")
h=Poly("3x^4")
printf "f+g*h = %s\n", (f+g*h)

fc=f.factorize
printf "%s = %s\n",f, Polynomial.factor2s(fc)

Result:

f+g*h = 2x^(7)+22x^(6)+18x^(5)+11x^(4)-2x^(3)+2x+1
2x^(7)+x^(6)-4x^(4)-2x^(3)+2x+1 = (x-1)(x-1)(2x+1)(x^(2)+x+1)(x^(2)+x+1)

(Introduction in Japanese)

インスト−ル

poly-ruby.*.tar.gz を 適当なディレクトリ(~/lib/ruby 等)で展開します.

展開したディレクトリが作業用のディレクトリで無い場合には, ~/.profile の中で, 展開したディレクトリを export RUBYLIB="~/lib/ruby" のようにして ruby が探せるように登録します.

主要なクラス,モジュ−ル

PolynomialM(多変数多項式クラス), GBase(多変数多項式環のグレブナ−ベ−ス. Rational,Zp,Complex係数) GBaseI(Z係数多項式環のグレブナ−ベ−ス), Polynomial(1変数多項式クラス), GBaseI1(1変数Z係数多項式環のグレブナ−ベ−ス), RationalPoly (1変数有理多項式), RationalPolyM (多変数有理多項式), Monomial(多変数単項式クラス), Number(数値関連のmodule), HyperReal(超実数計算), MathHyper(Math のRational,Polynomial,HyperReal 等対応版)

class PolynomialM(多変数多項式クラス)

+,-,*, /, % **   四則演算
divmod(divisors)  商と余りを返す. divisors は 除数の列(Array)
divmodZp Zp 上の割算
divmodI Z上の割算
substitute({代入リスト})  "変数名"==>値 の Hash に従って代入
derivative([vars])  配列内の変数名に対して順に偏微分を行う.
integral([vars])
    変数名の Array の 先頭の変数から順に積分し原始関数を求める.
     積分定数は考慮しない.
lt      leading term
lc      leading coefficient
lp      leading power product
coeff(var,deg)  var の多項式と見ての deg 次の係数多項式を返す.
maxdeg(var)  var の多項式と見ての最高次数
mindeg(var)  var の多項式と見ての最低次数
PolynomialM(arg)
     arg に対応する多項式を生成.
     "(x+2y)^3(x-y)^2" のような文字列を受け付ける.
to_s(format)
  format: "text" then "5x^4+3x^2+1"  (default)
          "tex"       "5x^{4}+3x^{2}+1"
          "texm"      "$5x^{4}+3x^{2}+1$"
          "prog"      "5*x**4+3*x**2+1"

module GBase(多変数多項式のグレブナ−ベ−ス)

getGBase(plist)
getGBaseZp(plist,prime)
     plist be Array of PolynomialM
     return Array of PolynomialM of Reduced Grobner base 
     over field Rational, Complex, Float or Zp(p:prime).

module GBaseI(整数係数多変数多項式のグレブナ−ベ−ス)

    minimal strong Groebner bases を求める.
getGBaseI(plist)

class Polynomial(1変数多項式クラス)

+ - * / % **  加算,減算, 乗算, 冪乗
divmod(poly)  除算. 商,余り の組みを返す
divmodI(poly) 商を Z[x] 上で除算. 商,余り の組みを返す
        余りの次数が除数より大きい可能性もある.
divmodZp(poly,p) Zp 上での除算, pは素数とする. 商,余りの組みを返す
derivative 微分
integral   積分
substitute(x) 代入, "x" は Integer , Float, Polynomial 等
factorize  Integer または Rational 係数で因数分解
countSolution(a="-infty",b="infty", countRedundancy=true)
      区間 (a,b) での実数解の個数.
Polynomial.gcd(a,b,c,...)    最大公約式
Polynomial.gcd2(a,b,c,...) or gcd2([a,b,c,...])
         最大公約式と 最大公約式を作る線形結合の係数
         return gcd,x,y,z,..  s.t. gcd=a*x+b*y+c*z+...
Polynomial.gcdZp(prime,a,b,c,...) 上の Zp係数版
Polynomial.gcd2Zp(prime,a,b,c,...) 上の Zp係数版
zero?   0か
normalize!  高次の余分な0を削除, 低次の0を補完
degree  多項式の次数
lt      最高次の項 cx^n. leading term
lc      最高次の係数 c. leading coefficient
lp      最高次のxべき x^n.  leading power product
Polynomial(arg)
       arg に対応する Polynomial を返す
       Polynomial([5,6,7])=5+6x+7x^2   配列から
       Polynomial(5,6,7)=5+6x+7x^2     数列から
       Polynomial("5+6x+7x^2")=5+6x+7x^2  文字列から
       Polynomial("5+6*x+7*x**2")=5+6x+7x^2  文字列の別な形式
       Polynomial("(x+1)**2(x-1)**2")=x^4-2x^2+1  文字列の別な形式
Polynomial.gen_func 又は array.to_poly 
      Array 型の オブジェクト array に対応する母関数を返す
      各次数の係数が array で指定されていると考えれば良い.
Polynomial.exp_gen_func 指数型母関数
to_a  係数の並びからなる Array に変換 gen_func の逆
to_s(var="x",order=true,format="text")
       文字列に変換
       "5x^4+3x^2+1", "5x^{4}+3x^{2}+1",
      "$5x^{4}+3x^{2}+1$", "5*x**4+3*x**2+1" などの書式を指定できる.

module GBaseI1 モジュ−ル

      Z係数 1変数 多項式環 Z[x] の ideal の
      minimal strong Grobner basis を求める.
getGBase(plist)

class RationalPoly (1変数有理多項式)

+,-,*,/,%,divmod
substitute(x) xを代入.
derivative  微分

class RationalPolyM (多変数有理多項式)

+,-,*,/,%, divmod
substitute({代入リスト})  "変数名"==>値 の Hash に従って代入
derivative([vars])  配列内の変数名に対して順に偏微分を行う.

class Monomial

Monomial.setTermOrder(t)  項の順序づけ.
Monomial.getTermOrder
        t= "lex"(default), "deglex",  "degrevlex"
        set/get term order
Monomial.setVarOrder(order)  変数の順序づけ
Monomial.getVarOrder
Monomial.appendVarName(v)
       set/get/append var. order
   default: VarOrder=["x","y","z","s","t","u","v","w"]

module Number モジュ−ル

prime?(x)  素数か?
checkDivZ?(a,b,p) (b+k*p)|a となる k はあるか? a,b,p,k,は整数.
inv(n,p)   Zp での n の逆数を返す.
factorize(n)   素因数分解. return list [p1,p2,p3,...]
factor2s(factor,sep=" ") factorize で得た 素因数列を文字列に直す.
gcd(a,b,c,...)    最大公約数
gcd2(a,b,c,...) or gcd2([a,b,c,...])
          最大公約数と 最大公約数を作る線形結合の係数
         return gcd,x,y,z,..  s.t. gcd=a*x+b*y+c*z+...
lcm(a,b,c,...) 最小公倍数.
factorial(n)   階乗
nextPrime(n)  nより大きい最小の素数.
makePrimeList(n=3)  2から 少なくとも nまでの素数表を作成.
       できた表は Number::PrimeList[i] で参照できる.
i_to_notation_str(i,b) 整数を b を基数とする表現の文字列に変換
i_to_notation_array(i,b) b を基数とする数値表示の各桁の列
i_to_notation_factorial(i) 階乗基数表示での各桁の列
notation_str_to_i(str,b) bを基数として数値を表す文字列を整数に変換
notation_array_to_i(c,b) bを基数とする各桁の列から整数を作る
         i=c[n]n!+c[n-1](n-1)!+...+c[2]2!+c[1]1!, c[0]=0  (i>=0) 
notation_factorial_to_i(c) i_to_notation_fractal の逆
factor2s(factor,sep=" ")
      factorize で得た 素因数列を文字列に直す.

参考図書


Kodama's home / tips.