001 /*
002 * $Id: RealRootTuple.java 3603 2011-04-25 18:31:43Z kredel $
003 */
004
005 package edu.jas.root;
006
007
008 import java.util.List;
009 import java.util.ArrayList;
010
011 import edu.jas.arith.BigDecimal;
012 import edu.jas.arith.BigRational;
013 import edu.jas.arith.Rational;
014 import edu.jas.structure.ElemFactory;
015 import edu.jas.structure.RingElem;
016 import edu.jas.structure.GcdRingElem;
017 import edu.jas.structure.RingFactory;
018
019
020 /**
021 * RealAlgebraicNumber root tuple.
022 * @param <C> coefficient type.
023 * @author Heinz Kredel
024 */
025 public class RealRootTuple<C extends GcdRingElem<C> & Rational> {
026
027
028 /**
029 * Tuple of RealAlgebraicNumbers.
030 */
031 public final List<RealAlgebraicNumber<C>> tuple;
032
033
034 /**
035 * Constructor.
036 * @param t list of roots.
037 */
038 public RealRootTuple(List<RealAlgebraicNumber<C>> t) {
039 if ( t == null ) {
040 throw new IllegalArgumentException("null tuple not allowed");
041 }
042 tuple = t;
043 }
044
045
046 /**
047 * String representation of tuple.
048 * @see java.lang.Object#toString()
049 */
050 @Override
051 public String toString() {
052 return tuple.toString();
053 }
054
055
056 /**
057 * Get a scripting compatible string representation.
058 * @return script compatible representation for this Rectangle.
059 */
060 public String toScript() {
061 // Python case
062 StringBuffer sb = new StringBuffer("[");
063 boolean first = true;
064 for (RealAlgebraicNumber<C> r : tuple) {
065 if ( first ) {
066 first = false;
067 } else {
068 sb.append(",");
069 }
070 sb.append(r.toScript());
071 }
072 return sb.toString();
073 }
074
075
076 /*
077 * Contains a point.
078 * @param c point.
079 * @return true if c is contained in this rectangle, else false.
080 public boolean contains(Complex<C> c) {
081 Complex<C> ll = getSW();
082 Complex<C> ur = getSW();
083 return c.getRe().compareTo(ll.getRe()) < 0 ||
084 c.getIm().compareTo(ll.getIm()) < 0 ||
085 c.getRe().compareTo(ur.getRe()) > 0 ||
086 c.getIm().compareTo(ur.getIm()) > 0;
087 }
088 */
089
090
091 /*
092 * Random point of recatangle.
093 * @return a random point contained in this rectangle.
094 public Complex<C> randomPoint() {
095 Complex<C> sw = getSW();
096 Complex<C> se = getSE();
097 Complex<C> nw = getNW();
098 Complex<C> r = sw.factory().random(13);
099 C dr = se.getRe().subtract(sw.getRe()); // >= 0
100 C di = nw.getIm().subtract(sw.getIm()); // >= 0
101 C rr = r.getRe().abs();
102 C ri = r.getIm().abs();
103 C one = ((RingFactory<C>)dr.factory()).getONE();
104 if ( !rr.isZERO() ) {
105 if ( rr.compareTo(one) > 0 ) {
106 rr = rr.inverse();
107 }
108 }
109 if ( !ri.isZERO() ) {
110 if ( ri.compareTo(one) > 0 ) {
111 ri = ri.inverse();
112 }
113 }
114 // 0 <= rr, ri <= 1
115 rr = rr.multiply(dr);
116 ri = ri.multiply(di);
117 Complex<C> rp = new Complex<C>(sw.factory(),rr,ri);
118 //System.out.println("rp = " + rp);
119 rp = sw.sum(rp);
120 return rp;
121 }
122 */
123
124
125 /**
126 * Clone this.
127 * @see java.lang.Object#clone()
128 */
129 @Override
130 public RealRootTuple<C> clone() {
131 return new RealRootTuple<C>(new ArrayList<RealAlgebraicNumber<C>>(tuple));
132 }
133
134
135 /**
136 * Comparison with any other object.
137 * @see java.lang.Object#equals(java.lang.Object)
138 */
139 @Override
140 @SuppressWarnings("unchecked")
141 public boolean equals(Object b) {
142 if (!(b instanceof RealRootTuple)) {
143 return false;
144 }
145 RealRootTuple<C> a = null;
146 try {
147 a = (RealRootTuple<C>) b;
148 } catch (ClassCastException e) {
149 }
150 return tuple.equals(a.tuple);
151 }
152
153
154 /**
155 * Hash code for this Rectangle.
156 * @see java.lang.Object#hashCode()
157 */
158 @Override
159 public int hashCode() {
160 return tuple.hashCode();
161 }
162
163
164 /**
165 * Rational approximation of each coordinate.
166 * @return list of coordinate points.
167 */
168 public List<BigRational> getRational() {
169 List<BigRational> center = new ArrayList<BigRational>(tuple.size());
170 for ( RealAlgebraicNumber<C> rr : tuple ) {
171 BigRational r = rr.getRational();
172 center.add(r);
173 }
174 return center;
175 }
176
177
178 /**
179 * Decimal approximation of each coordinate.
180 * @return list of coordinate points.
181 */
182 public List<BigDecimal> decimalMagnitude() {
183 List<BigDecimal> center = new ArrayList<BigDecimal>(tuple.size());
184 for ( RealAlgebraicNumber<C> rr : tuple ) {
185 BigDecimal r = rr.decimalMagnitude();
186 center.add(r);
187 }
188 return center;
189 }
190
191
192 /**
193 * Rational Length.
194 * @return max |v_i|;
195 */
196 public BigRational rationalLength() {
197 BigRational len = new BigRational();
198 for ( RealAlgebraicNumber<C> rr : tuple ) {
199 BigRational r = rr.ring.root.rationalLength();
200 int s = len.compareTo(r);
201 if ( s < 0 ) {
202 len = r;
203 }
204 }
205 return len;
206 }
207
208
209 /**
210 * Signum.
211 * @return ?;
212 */
213 public int signum() {
214 int s = 0;
215 for ( RealAlgebraicNumber<C> rr : tuple ) {
216 int rs = rr.signum();
217 if ( rs != 0 ) {
218 s = rs;
219 }
220 }
221 return s;
222 }
223
224 }