package math.equation;



/**
 * 
 * @author Daniel Weschke
 *
 */
public class Polynomials{
    private Polynomial[] pols;
    
    public Polynomials(int n){
    	pols = new Polynomial[n];
    }
    
    public Polynomial get(int i){
    	return pols[i];
    }
    
    public void set(int i, Polynomial pol){
    	pols[i] = pol;
    }
	
	/**
	 * First n Chebyshev polynomials of the first kind.
	 * <p>
	 * T<sub>0</sub> = 1<br />
	 * T<sub>1</sub> = x<br />
	 * T<sub>n</sub> = 2x * T<sub>n-1</sub> - T<sub>n-2</sub><br />
	 * <p>
	 * n = 1:<br />
	 * 1x<sup>0</sup><br />
	 * <p>
	 * n = 2:<br />
	 * 1x<sup>0</sup><br />
	 * 1x<sup>1</sup><br />
	 * <p>
	 * n = 10:<br />
	 * 1x<sup>0</sup><br />
	 * 1x<sup>1</sup><br />
	 * 2x<sup>2</sup> - 1x<sup>0</sup><br />
	 * 4x<sup>3</sup> - 3x<sup>1</sup><br />
	 * 8x<sup>4</sup> - 8x<sup>2</sup> + 1x<sup>0</sup><br />
	 * 16x<sup>5</sup> - 20x<sup>3</sup> + 5x<sup>1</sup><br />
	 * 32x<sup>6</sup> - 48x<sup>4</sup> + 18x<sup>2</sup> - 1x<sup>0</sup><br />
	 * 64x<sup>7</sup> - 112x<sup>5</sup> + 56x<sup>3</sup> - 7x<sup>1</sup><br />
	 * 128x<sup>8</sup> - 256x<sup>6</sup> + 160x<sup>4</sup> - 32x<sup>2</sup> + 1x<sup>0</sup><br />
	 * 256x<sup>9</sup> - 576x<sup>7</sup> + 432x<sup>5</sup> - 120x<sup>3</sup> + 9x<sup>1</sup><br />
	 * @param n number of first n Chebyshev polynomials
	 * @return T<sub>0</sub> ... T<sub>n-1</sub>
	 * @see Polynomial#chebyshevT(int)
	 */
	public static Polynomials chebyshevT(int n){
        Polynomials T = new Polynomials(Math.max(2, n));
        int i;
        for(i=0; i<n; i++)
            T.set(i,Polynomial.chebyshevT(i));
        return T;
	}
	
	/**
	 * First n Chebyshev polynomials of the second kind.
	 * <p>
	 * U<sub>0</sub> = 1<br />
	 * U<sub>1</sub> = 2x<br />
	 * U<sub>n</sub> = 2x * U<sub>n-1</sub> - U<sub>n-2</sub><br />
	 * <p>
	 * n = 1:<br />
	 * 1x<sup>0</sup><br />
	 * <p>
	 * n = 2:<br />
	 * 1x<sup>0</sup><br />
	 * 2x<sup>1</sup><br />
	 * <p>
	 * n = 10:<br />
	 * 1x<sup>0</sup><br />
	 * 2x<sup>1</sup><br />
	 * 4x<sup>2</sup> - 1x<sup>0</sup><br />
	 * 8x<sup>3</sup> - 4x<sup>1</sup><br />
	 * 16x<sup>4</sup> - 12x<sup>2</sup> + 1x<sup>0</sup><br />
	 * 32x<sup>5</sup> - 32x<sup>3</sup> + 6x<sup>1</sup><br />
	 * 64x<sup>6</sup> - 80x<sup>4</sup> + 24x<sup>2</sup> - 1x<sup>0</sup><br />
	 * 128x<sup>7</sup> - 192x<sup>5</sup> + 80x<sup>3</sup> - 8x<sup>1</sup><br />
	 * 256x<sup>8</sup> - 448x<sup>6</sup> + 240x<sup>4</sup> - 40x<sup>2</sup> + 1x<sup>0</sup><br />
	 * 512x<sup>9</sup> - 1024x<sup>7</sup> + 672x<sup>5</sup> - 160x<sup>3</sup> + 10x<sup>1</sup><br />
	 * @param n number of first n Chebyshev polynomials
	 * @return U<sub>0</sub> ... U<sub>n-1</sub>
	 * @see Polynomial#chebyshevT(int)
	 */
	public static Polynomials chebyshevU(int n){
        Polynomials T = new Polynomials(Math.max(2, n));
        int i;
        for(i=0; i<n; i++)
            T.set(i,Polynomial.chebyshevU(i));
        return T;
	}
	
	/**
	 * First n Hermite polynomials.
	 * <p>
	 * H<sub>0</sub> = 1<br />
	 * H<sub>1</sub> = 2x<br />
	 * H<sub>n</sub> = 2x * H<sub>n-1</sub> - 2(n-1) * H<sub>n-2</sub><br />
	 * <p>
	 * n = 1:<br />
	 * 1x<sup>0</sup><br />
	 * <p>
	 * n = 2:<br />
	 * 1x<sup>0</sup><br />
	 * 2x<sup>1</sup><br />
	 * <p>
	 * n = 10:<br />
	 * 1x<sup>0</sup><br />
	 * 2x<sup>1</sup><br />
	 * 4x<sup>2</sup> - 2x<sup>0</sup><br />
	 * 8x<sup>3</sup> - 12x<sup>1</sup><br />
	 * 16x<sup>4</sup> - 48x<sup>2</sup> + 12x<sup>0</sup><br />
	 * 32x<sup>5</sup> - 160x<sup>3</sup> + 120x<sup>1</sup><br />
	 * 64x<sup>6</sup> - 480x<sup>4</sup> + 720x<sup>2</sup> - 120x<sup>0</sup><br />
	 * 128x<sup>7</sup> - 1344x<sup>5</sup> + 3360x<sup>3</sup> - 1680x<sup>1</sup><br />
	 * 256x<sup>8</sup> - 3584x<sup>6</sup> + 13440x<sup>4</sup> - 13440x<sup>2</sup> + 1680x<sup>0</sup><br />
	 * 512x<sup>9</sup> - 9216x<sup>7</sup> + 48384x<sup>5</sup> - 80640x<sup>3</sup> + 30240x<sup>1</sup><br />
	 * @param n number of first n Chebyshev polynomials
	 * @return H<sub>0</sub> ... H<sub>n-1</sub>
	 * @see Polynomial#chebyshevT(int)
	 */
	public static Polynomials hermite(int n){
        Polynomials T = new Polynomials(Math.max(2, n));
        int i;
        for(i=0; i<n; i++)
            T.set(i,Polynomial.hermite(i));
        return T;
	}
	
	/**
	 * First n Hermite polynomials (probabilist).
	 * <p>
	 * He<sub>0</sub> = 1<br />
	 * He<sub>1</sub> = x<br />
	 * He<sub>n</sub> = x * He<sub>n-1</sub> - (n-1) * He<sub>n-2</sub><br />
	 * <p>
	 * n = 1:<br />
	 * 1x<sup>0</sup><br />
	 * <p>
	 * n = 2:<br />
	 * 1x<sup>0</sup><br />
	 * x<sup>1</sup><br />
	 * <p>
	 * n = 10:<br />
	 * 1x<sup>0</sup><br />
	 * x<sup>1</sup><br />
	 * x<sup>2</sup> - 1x<sup>0</sup><br />
	 * x<sup>3</sup> - 3x<sup>1</sup><br />
	 * x<sup>4</sup> - 6x<sup>2</sup> + 3x<sup>0</sup><br />
	 * x<sup>5</sup> - 10x<sup>3</sup> + 15x<sup>1</sup><br />
	 * x<sup>6</sup> - 15x<sup>4</sup> + 45x<sup>2</sup> - 15x<sup>0</sup><br />
	 * x<sup>7</sup> - 21x<sup>5</sup> + 105x<sup>3</sup> - 105x<sup>1</sup><br />
	 * x<sup>8</sup> - 28x<sup>6</sup> + 210x<sup>4</sup> - 420x<sup>2</sup> + 105x<sup>0</sup><br />
	 * x<sup>9</sup> - 36x<sup>7</sup> + 378x<sup>5</sup> - 1260x<sup>3</sup> + 945x<sup>1</sup><br />
	 * @param n number of first n Chebyshev polynomials
	 * @return He<sub>0</sub> ... He<sub>n-1</sub>
	 * @see Polynomial#chebyshevT(int)
	 */
	public static Polynomials hermiteE(int n){
        Polynomials T = new Polynomials(Math.max(1, n));
        int i;
        for(i=0; i<n; i++)
            T.set(i,Polynomial.hermiteE(i));
        return T;
	}

	/**
	 * Convert to string representation
	 */
    @Override
	public String toString() {
        String s = null;
        int n = pols.length;
        for(int i=0; i<n; i++)
            s = s + pols[i].toString();
        return s;
    }

    /**
     * test client
     * @param args
     */
    public static void main(String[] args) {
    	int n = 10;
        Polynomials T = Polynomials.chebyshevT(n);
        for(int i=0; i<n; i++)
            System.out.println(T.get(i));
        System.out.println();
        Polynomials U = Polynomials.chebyshevU(n);
        for(int i=0; i<n; i++)
            System.out.println(U.get(i));
        System.out.println();
        Polynomials H = Polynomials.hermite(n);
        for(int i=0; i<n; i++)
            System.out.println(H.get(i));
        System.out.println();
        Polynomials He = Polynomials.hermiteE(n);
        for(int i=0; i<n; i++)
            System.out.println(He.get(i));
   }

}