Kodama's home / tips.
#!/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)
展開したディレクトリが作業用のディレクトリで無い場合には, ~/.profile の中で, 展開したディレクトリを export RUBYLIB="~/lib/ruby" のようにして ruby が探せるように登録します.
+,-,*, /, % ** 四則演算 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"
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).
minimal strong Groebner bases を求める. getGBaseI(plist)
+ - * / % ** 加算,減算, 乗算, 冪乗 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" などの書式を指定できる.
Z係数 1変数 多項式環 Z[x] の ideal の minimal strong Grobner basis を求める. getGBase(plist)
+,-,*,/,%,divmod substitute(x) xを代入. derivative 微分
+,-,*,/,%, divmod substitute({代入リスト}) "変数名"==>値 の Hash に従って代入 derivative([vars]) 配列内の変数名に対して順に偏微分を行う.
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"]
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.