/* An undocumented Poly class Used in SWE/CS 332 to explain AF/RI. */ public class Poly { private int[] trms; private int deg; public Poly() { trms = new int[1]; trms[0] = 0; deg = 0; } public Poly(int c, int n) throws IllegalArgumentException { if (n < 0) { throw new IllegalArgumentException("Poly(int, int) constructor"); } if (c == 0) { trms = new int[1]; trms[0] = 0; deg = 0; return; } trms = new int[n+1]; for (int i=0; i < n; i++) { trms[i] = 0; } trms[n] = c; deg = n; } private Poly (int n) { trms = new int[n+1]; deg = n; } public int degree() { return deg; } public int coeff(int d) { return (d < 0 || d > deg) ? 0 : trms[d]; } public Poly sub(Poly q) throws NullPointerException { return add(q.minus()); } public Poly minus() { Poly r = new Poly(deg); for (int i=0; i <= deg; i++) { r.trms[i] = -trms[i]; } return r; } public Poly add(Poly q) throws NullPointerException { Poly la, sm; if (deg > q.deg) { la = this; sm = q; } else { la = q; sm = this; } int newdeg = la.deg; if (deg == q.deg) { for (int k = deg; k > 0; k--) { // fixed k++ bug here 10/10/2011 if (trms[k] + q.trms[k] != 0) { break; } else { newdeg--; } } } Poly r = new Poly(newdeg); int i; for (i = 0; i <= sm.deg && i <= newdeg; i++) { r.trms[i] = sm.trms[i] + la.trms[i]; } for (int j = i; j <= newdeg; j++) { r.trms[j] = la.trms[j]; } return r; } public Poly mul(Poly q) throws NullPointerException { if ((q.deg == 0 && q.trms[0] == 0) || (deg == 0 && trms[0] == 0)) { return new Poly(); } Poly r = new Poly(deg + q.deg); r.trms[deg + q.deg] = 0; for (int i = 0; i <= deg; i++) { for (int j = 0; j <= q.deg; j++) { r.trms[i+j] += trms[i]*q.trms[j]; } } return r; } public String toString() { String r = "Poly:"; if (deg == 0 || trms[0] != 0) { r += " " + trms[0]; } for (int i = 1; i <= deg; i++) { if (trms[i] < 0) { r += " - " + -trms[i] + "x^" + i; } else if (trms[i] > 0) { r += " + " + trms[i] + "x^" + i; } } return r; } }