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