001    /*
002     * $Id: Integral.java 3295 2010-08-26 17:01:10Z kredel $
003     */
004    
005    package edu.jas.integrate;
006    
007    
008    import java.io.Serializable;
009    import java.util.ArrayList;
010    import java.util.List;
011    
012    import edu.jas.poly.GenPolynomial;
013    import edu.jas.structure.GcdRingElem;
014    
015    
016    /**
017     * Container for a rational function integral, polynomial version.
018     * integral(num/den) = pol + sum_rat( rat_i/rat_{i+1} ) + sum_log( a_i log ( d_i
019     * ) )
020     * @author Heinz Kredel
021     * @param <C> coefficient type
022     */
023    
024    public class Integral<C extends GcdRingElem<C>> implements Serializable {
025    
026    
027        /**
028         * Original numerator polynomial with coefficients from C.
029         */
030        public final GenPolynomial<C> num;
031    
032    
033        /**
034         * Original denominator polynomial with coefficients from C.
035         */
036        public final GenPolynomial<C> den;
037    
038    
039        /**
040         * Integral of the polynomial part.
041         */
042        public final GenPolynomial<C> pol;
043    
044    
045        /**
046         * Integral of the rational part.
047         */
048        public final List<GenPolynomial<C>> rational;
049    
050    
051        /**
052         * Integral of the logarithmic part.
053         */
054        public final List<LogIntegral<C>> logarithm;
055    
056    
057        /**
058         * Constructor.
059         * @param n numerator GenPolynomial over C.
060         * @param d denominator GenPolynomial over C.
061         * @param p integral of polynomial part. n/d =
062         */
063        public Integral(GenPolynomial<C> n, GenPolynomial<C> d, GenPolynomial<C> p) {
064            this(n, d, p, new ArrayList<GenPolynomial<C>>());
065        }
066    
067    
068        /**
069         * Constructor.
070         * @param n numerator GenPolynomial over C.
071         * @param d denominator GenPolynomial over C.
072         * @param p integral of polynomial part.
073         * @param rat list of rational integrals. n/d =
074         */
075        public Integral(GenPolynomial<C> n, GenPolynomial<C> d, GenPolynomial<C> p, List<GenPolynomial<C>> rat) {
076            this(n, d, p, rat, new ArrayList<LogIntegral<C>>());
077        }
078    
079    
080        /**
081         * Constructor.
082         * @param n numerator GenPolynomial over C.
083         * @param d denominator GenPolynomial over C.
084         * @param p integral of polynomial part.
085         * @param rat list of rational integrals.
086         * @param log list of logarithmic part. n/d =
087         */
088        public Integral(GenPolynomial<C> n, GenPolynomial<C> d, GenPolynomial<C> p, List<GenPolynomial<C>> rat,
089                List<LogIntegral<C>> log) {
090            num = n;
091            den = d;
092            pol = p;
093            rational = rat;
094            logarithm = log;
095        }
096    
097    
098        /**
099         * Get the String representation.
100         * @see java.lang.Object#toString()
101         */
102        @Override
103        public String toString() {
104            StringBuffer sb = new StringBuffer();
105            sb.append("integral( (" + num.toString());
106            sb.append(") / (");
107            sb.append(den.toString() + ") )");
108            sb.append(" =\n");
109            if (!pol.isZERO()) {
110                sb.append(pol.toString());
111            }
112            boolean first = true;
113            if (rational.size() != 0) {
114                if (!pol.isZERO()) {
115                    sb.append(" + ");
116                }
117                for (int i = 0; i < rational.size(); i++) {
118                    if (first) {
119                        first = false;
120                    } else {
121                        sb.append(" + ");
122                    }
123                    sb.append("(" + rational.get(i++) + ")/(");
124                    sb.append(rational.get(i) + ")");
125                }
126            }
127            if (logarithm.size() != 0) {
128                if (!pol.isZERO() || rational.size() != 0) {
129                    sb.append(" + ");
130                }
131                first = true;
132                for (LogIntegral<C> pf : logarithm) {
133                    if (first) {
134                        first = false;
135                    } else {
136                        sb.append(" + ");
137                    }
138                    sb.append(pf);
139                }
140                sb.append("\n");
141            }
142            return sb.toString();
143        }
144    
145    
146        /**
147         * Hash code for Integral.
148         * @see java.lang.Object#hashCode()
149         */
150        @Override
151        public int hashCode() {
152            int h = num.hashCode();
153            h = h * 37 + den.hashCode();
154            h = h * 37 + pol.hashCode();
155            h = h * 37 + rational.hashCode();
156            h = h * 37 + logarithm.hashCode();
157            return h;
158        }
159    
160    }