/// <summary> /// チェビシェフ有理式(elliptic rational)を計算する。 /// </summary> /// <param name="n">次数</param> /// <param name="l">x > 1 における極小値</param> /// <returns>次数 n のチェビシェフ有理式</returns> public static Rational Elliptic(int n, double l) { double m1 = 1 / (l * l); double m1p = 1 - m1; double Kk1 = Ellip.K(m1); double Kk1p = Ellip.K(m1p); double m = Ellip.InverseQ(Math.Exp(-Math.PI * Kk1p / (n * Kk1))); double Kk = Ellip.K(m); Polynomial num = Polynomial.X(0, 1); Polynomial denom = Polynomial.X(0, 1); Rational r = new Rational(Polynomial.X(0, 1), Polynomial.X(0, 1)); double g = 1; for(int i=n-1; i>0; i-=2) { double u = Kk * (double)i / n; double sn = Ellip.Sn(u, m); double w = sn * sn; g *= (m*w - 1) / (1/w - 1); num *= Polynomial.X(2, 1/w) - 1; denom *= Polynomial.X(2, m*w) - 1; } if((n & 1) == 1) { num *= Polynomial.X(1); } num *= g; return new Rational(num, denom); }
/// <summary> /// 分子/分母多項式を指定して初期化。 /// </summary> /// <param name="num">分子多項式</param> /// <param name="denom">分母多項式</param> public Rational(Polynomial num, Polynomial denom) { this.num = num; this.denom = denom; }
/// <summary> /// x の n 乗を返す。 /// </summary> /// <param name="n">指数</param> /// <returns>x の n 乗</returns> public static Polynomial X(int n) { return(Polynomial.X(n, 1)); }