import java.util.Arrays;


public class Polynôme {
	private static final int MAX_COEF = 8;
	private double[] coefficients;
	
	// construit le polynôme nul
	public Polynôme() {
		coefficients = new double[MAX_COEF + 1];
		Arrays.fill(coefficients, 0);
	}
	
	// construit le monôme v * x^c
	public Polynôme(double v, int c) {
		this();
		coefficients[c] = v;
	}

	// construit le polynôme constant v
	public Polynôme(double v) {
		this(v, 0);
	}
	
	// construit une copie d'un polynôme p
	public Polynôme(Polynôme p) {
		coefficients = p.coefficients.clone();
	}
	
	// retourne une copie du Polynôme
	public Polynôme clone() {
		return new Polynôme(this);
	}
	
	public double valeur(double x) {
		double r = 0, p = 1;
		for (int i = 0; i <= MAX_COEF; ++i) {
			r += coefficients[i] * p;
			p *= x;
		}
		return r;
	}
	
	public Polynôme plus(Polynôme p) {
		Polynôme r = new Polynôme();
		for (int i = 0; i <= MAX_COEF; ++i)
			r.coefficients[i] = coefficients[i] + p.coefficients[i];
		return r;
	}
	
	public Polynôme dérivée() {
		Polynôme r = new Polynôme();
		for (int i = 1; i <= MAX_COEF; ++i)
			r.coefficients[i - 1] = i * coefficients[i];
		return r;
	}
	
	public boolean estConstant() {
		for (int i = 1; i <= MAX_COEF; ++i)
			if (coefficients[i] != 0)
				return false;
		return true;
	}
	
	public boolean estNul() {
		return coefficients[0] == 0 && estConstant();
	}
	
	public String toString() {
		StringBuilder sb = new StringBuilder();
		boolean first = true;
		for (int i = MAX_COEF; i >= 0; --i) {
			if (coefficients[i] != 0) {
				String prefixe = "";
				if (first)
					prefixe = Double.toString(coefficients[i]);
				else if (coefficients[i] < 0)
					prefixe = " - " + (-coefficients[i]);
				else
					prefixe = " + " + coefficients[i];
				first = false;
				if (i > 1)
					sb.append(prefixe + "*x^" + i);
				else if (i == 1)
					sb.append(prefixe + "*x");
				else
					sb.append(prefixe);
			}
		}
		if (first)
			sb.append("0");
		return sb.toString();
	}

//	// version simplifiée mais très raisonnable	
//	public String toString() {
//		StringBuilder sb = new StringBuilder();
//		boolean first = true;
//		for (int i = MAX_COEF; i >= 0; --i) {
//			if (coefficients[i] != 0) {
//				if (!first)
//					sb.append(" + ");
//				first = false;
//				sb.append(coefficients[i] + "*x^" + i);
//			}
//		}
//		if (first)
//			sb.append("0");
//		return sb.toString();
//	}
}
