001 /*
002 * $Id: RealAlgebraicNumber.java 3655 2011-06-02 18:20:54Z kredel $
003 */
004
005 package edu.jas.application;
006
007
008 import edu.jas.arith.BigDecimal;
009 import edu.jas.arith.BigRational;
010 import edu.jas.arith.Rational;
011 import edu.jas.kern.PrettyPrint;
012 import edu.jas.poly.GenPolynomial;
013 import edu.jas.structure.GcdRingElem;
014 import edu.jas.structure.NotInvertibleException;
015
016
017 /**
018 * Complex algebraic number class based on bi-variate real algebraic numbers.
019 * Objects of this class are immutable. Bi-variate ideal implementation is in
020 * version 3614 2011-04-28 09:20:34Z.
021 * @author Heinz Kredel
022 */
023
024 public class RealAlgebraicNumber<C extends GcdRingElem<C> & Rational> implements
025 GcdRingElem<RealAlgebraicNumber<C>>, Rational {
026
027
028 /*
029 * Representing Residue, unused.
030 */
031 private Residue<C> numberRes;
032
033
034 /**
035 * Representing recursive RealAlgebraicNumber.
036 */
037 public final edu.jas.root.RealAlgebraicNumber<edu.jas.root.RealAlgebraicNumber<C>> number;
038
039
040 /**
041 * Ring part of the data structure.
042 */
043 public final RealAlgebraicRing<C> ring;
044
045
046 /**
047 * The constructor creates a zero RealAlgebraicNumber.
048 * @param r ring RealAlgebraicRing<C>.
049 */
050 public RealAlgebraicNumber(RealAlgebraicRing<C> r) {
051 this(r, r.realRing.getZERO());
052 }
053
054
055 /**
056 * The constructor creates a RealAlgebraicNumber object from a GenPolynomial
057 * value.
058 * @param r ring RealAlgebraicRing<C>.
059 * @param a value GenPolynomial<C>.
060 */
061 public RealAlgebraicNumber(RealAlgebraicRing<C> r, GenPolynomial<C> a) {
062 this(r, r.realRing.parse(a.toString()));
063 }
064
065
066 /**
067 * The constructor creates a RealAlgebraicNumber object from a recursive
068 * real algebraic value.
069 * @param r ring RealAlgebraicRing<C>.
070 * @param a recursive real algebraic number.
071 */
072 public RealAlgebraicNumber(RealAlgebraicRing<C> r,
073 edu.jas.root.RealAlgebraicNumber<edu.jas.root.RealAlgebraicNumber<C>> a) {
074 number = a;
075 ring = r;
076 //number = ring.realRing.parse(number.val.toString()); // todo: convert
077 //System.out.println("number = " + number);
078 }
079
080
081 /**
082 * Get the corresponding element factory.
083 * @return factory for this Element.
084 * @see edu.jas.structure.Element#factory()
085 */
086 public RealAlgebraicRing<C> factory() {
087 return ring;
088 }
089
090
091 /**
092 * Clone this.
093 * @see java.lang.Object#clone()
094 */
095 @Override
096 public RealAlgebraicNumber<C> clone() {
097 return new RealAlgebraicNumber<C>(ring, number);
098 }
099
100
101 /**
102 * Return a BigRational approximation of this Element.
103 * @return a BigRational approximation of this.
104 * @see edu.jas.arith.Rational#getRational()
105 */
106 //JAVA6only: @Override
107 public BigRational getRational() {
108 return magnitude();
109 }
110
111
112 /**
113 * Is RealAlgebraicNumber zero.
114 * @return If this is 0 then true is returned, else false.
115 * @see edu.jas.structure.RingElem#isZERO()
116 */
117 public boolean isZERO() {
118 return number.isZERO();
119 }
120
121
122 /**
123 * Is RealAlgebraicNumber one.
124 * @return If this is 1 then true is returned, else false.
125 * @see edu.jas.structure.RingElem#isONE()
126 */
127 public boolean isONE() {
128 return number.isONE();
129 }
130
131
132 /**
133 * Is RealAlgebraicNumber unit.
134 * @return If this is a unit then true is returned, else false.
135 * @see edu.jas.structure.RingElem#isUnit()
136 */
137 public boolean isUnit() {
138 return number.isUnit();
139 }
140
141
142 /**
143 * Get the String representation as RingElem.
144 * @see java.lang.Object#toString()
145 */
146 @Override
147 public String toString() {
148 if (PrettyPrint.isTrue()) {
149 return "{ " + number.toString() + " }";
150 }
151 return "Complex" + number.toString();
152 }
153
154
155 /**
156 * Get a scripting compatible string representation.
157 * @return script compatible representation for this Element.
158 * @see edu.jas.structure.Element#toScript()
159 */
160 //JAVA6only: @Override
161 public String toScript() {
162 // Python case
163 return number.toScript();
164 }
165
166
167 /**
168 * Get a scripting compatible string representation of the factory.
169 * @return script compatible representation for this ElemFactory.
170 * @see edu.jas.structure.Element#toScriptFactory()
171 */
172 //JAVA6only: @Override
173 public String toScriptFactory() {
174 // Python case
175 return factory().toScript();
176 }
177
178
179 /**
180 * RealAlgebraicNumber comparison.
181 * @param b RealAlgebraicNumber.
182 * @return sign(this-b).
183 */
184 //JAVA6only: @Override
185 public int compareTo(RealAlgebraicNumber<C> b) {
186 int s = 0;
187 if (number.ring != b.number.ring) {
188 s = (number.ring.equals(b.number.ring) ? 0 : 1);
189 System.out.println("s_mod = " + s);
190 }
191 if (s != 0) {
192 return s;
193 }
194 s = number.compareTo(b.number); // TODO
195 //System.out.println("s_real = " + s);
196 return s;
197 }
198
199
200 /**
201 * RealAlgebraicNumber comparison.
202 * @param b AlgebraicNumber.
203 * @return polynomial sign(this-b).
204 */
205 public int compareTo(edu.jas.root.RealAlgebraicNumber<edu.jas.root.RealAlgebraicNumber<C>> b) {
206 int s = number.compareTo(b);
207 //System.out.println("s_algeb = " + s);
208 return s;
209 }
210
211
212 /**
213 * Comparison with any other object.
214 * @see java.lang.Object#equals(java.lang.Object)
215 */
216 @Override
217 @SuppressWarnings("unchecked")
218 public boolean equals(Object b) {
219 if (!(b instanceof RealAlgebraicNumber)) {
220 return false;
221 }
222 RealAlgebraicNumber<C> a = null;
223 try {
224 a = (RealAlgebraicNumber<C>) b;
225 } catch (ClassCastException e) {
226 }
227 if (a == null) {
228 return false;
229 }
230 if (!ring.equals(a.ring)) {
231 return false;
232 }
233 return number.equals(a.number);
234 }
235
236
237 /**
238 * Hash code for this RealAlgebraicNumber.
239 * @see java.lang.Object#hashCode()
240 */
241 @Override
242 public int hashCode() {
243 return 37 * number.hashCode() + ring.hashCode();
244 }
245
246
247 /**
248 * RealAlgebraicNumber absolute value.
249 * @return the absolute value of this.
250 * @see edu.jas.structure.RingElem#abs()
251 */
252 public RealAlgebraicNumber<C> abs() {
253 if (this.signum() < 0) {
254 return new RealAlgebraicNumber<C>(ring, number.negate());
255 }
256 return this;
257 }
258
259
260 /**
261 * RealAlgebraicNumber summation.
262 * @param S RealAlgebraicNumber.
263 * @return this+S.
264 */
265 public RealAlgebraicNumber<C> sum(RealAlgebraicNumber<C> S) {
266 return new RealAlgebraicNumber<C>(ring, number.sum(S.number));
267 }
268
269
270 /**
271 * RealAlgebraicNumber summation.
272 * @param c recursive real algebraic number.
273 * @return this+c.
274 */
275 public RealAlgebraicNumber<C> sum(edu.jas.root.RealAlgebraicNumber<edu.jas.root.RealAlgebraicNumber<C>> c) {
276 return new RealAlgebraicNumber<C>(ring, number.sum(c));
277 }
278
279
280 /**
281 * RealAlgebraicNumber negate.
282 * @return -this.
283 * @see edu.jas.structure.RingElem#negate()
284 */
285 public RealAlgebraicNumber<C> negate() {
286 return new RealAlgebraicNumber<C>(ring, number.negate());
287 }
288
289
290 /**
291 * RealAlgebraicNumber subtraction.
292 * @param S RealAlgebraicNumber.
293 * @return this-S.
294 */
295 public RealAlgebraicNumber<C> subtract(RealAlgebraicNumber<C> S) {
296 return new RealAlgebraicNumber<C>(ring, number.subtract(S.number));
297 }
298
299
300 /**
301 * RealAlgebraicNumber division.
302 * @param S RealAlgebraicNumber.
303 * @return this/S.
304 */
305 public RealAlgebraicNumber<C> divide(RealAlgebraicNumber<C> S) {
306 return multiply(S.inverse());
307 }
308
309
310 /**
311 * RealAlgebraicNumber inverse.
312 * @see edu.jas.structure.RingElem#inverse()
313 * @throws NotInvertibleException if the element is not invertible.
314 * @return S with S = 1/this if defined.
315 */
316 public RealAlgebraicNumber<C> inverse() {
317 return new RealAlgebraicNumber<C>(ring, number.inverse());
318 }
319
320
321 /**
322 * RealAlgebraicNumber remainder.
323 * @param S RealAlgebraicNumber.
324 * @return this - (this/S)*S.
325 */
326 public RealAlgebraicNumber<C> remainder(RealAlgebraicNumber<C> S) {
327 return new RealAlgebraicNumber<C>(ring, number.remainder(S.number));
328 }
329
330
331 /**
332 * RealAlgebraicNumber multiplication.
333 * @param S RealAlgebraicNumber.
334 * @return this*S.
335 */
336 public RealAlgebraicNumber<C> multiply(RealAlgebraicNumber<C> S) {
337 return new RealAlgebraicNumber<C>(ring, number.multiply(S.number));
338 }
339
340
341 /**
342 * RealAlgebraicNumber multiplication.
343 * @param c recursive real algebraic number.
344 * @return this*c.
345 */
346 public RealAlgebraicNumber<C> multiply(
347 edu.jas.root.RealAlgebraicNumber<edu.jas.root.RealAlgebraicNumber<C>> c) {
348 return new RealAlgebraicNumber<C>(ring, number.multiply(c));
349 }
350
351
352 /**
353 * RealAlgebraicNumber monic.
354 * @return this with monic value part.
355 */
356 public RealAlgebraicNumber<C> monic() {
357 return new RealAlgebraicNumber<C>(ring, number.monic());
358 }
359
360
361 /**
362 * RealAlgebraicNumber greatest common divisor.
363 * @param S RealAlgebraicNumber.
364 * @return gcd(this,S).
365 */
366 public RealAlgebraicNumber<C> gcd(RealAlgebraicNumber<C> S) {
367 return new RealAlgebraicNumber<C>(ring, number.gcd(S.number));
368 }
369
370
371 /**
372 * RealAlgebraicNumber extended greatest common divisor.
373 * @param S RealAlgebraicNumber.
374 * @return [ gcd(this,S), a, b ] with a*this + b*S = gcd(this,S).
375 */
376 @SuppressWarnings("unchecked")
377 public RealAlgebraicNumber<C>[] egcd(RealAlgebraicNumber<C> S) {
378 edu.jas.root.RealAlgebraicNumber<edu.jas.root.RealAlgebraicNumber<C>>[] aret = number.egcd(S.number);
379 RealAlgebraicNumber<C>[] ret = new RealAlgebraicNumber[3];
380 ret[0] = new RealAlgebraicNumber<C>(ring, aret[0]);
381 ret[1] = new RealAlgebraicNumber<C>(ring, aret[1]);
382 ret[2] = new RealAlgebraicNumber<C>(ring, aret[2]);
383 return ret;
384 }
385
386
387 /**
388 * RealAlgebraicNumber signum.
389 * @see edu.jas.structure.RingElem#signum()
390 * @return signum(this).
391 */
392 public int signum() {
393 // if ( number == null ) { // no synchronization required
394 // GenPolynomial<C> p = number.val;
395 // number = ring.realRing.parse(p.toString()); // todo: convert
396 // //System.out.println("number = " + number);
397 // }
398 return number.signum();
399 }
400
401
402 /**
403 * RealAlgebraicNumber magnitude.
404 * @return |this| as rational number.
405 */
406 public BigRational magnitude() {
407 // if ( number == null ) { // no synchronization required
408 // GenPolynomial<C> p = number.val;
409 // number = ring.realRing.parse(p.toString()); // todo: convert
410 // //System.out.println("number = " + number);
411 // }
412 return number.magnitude();
413 }
414
415
416 /**
417 * RealAlgebraicNumber decimal magnitude.
418 * @return |this| as big decimal.
419 */
420 public BigDecimal decimalMagnitude() {
421 BigRational cr = magnitude();
422 return new BigDecimal(cr);
423 }
424
425 }