001 /*
002 * $Id: IdealWithRealAlgebraicRoots.java 3111 2010-05-05 21:05:56Z kredel $
003 */
004
005 package edu.jas.application;
006
007
008 import java.io.Serializable;
009 import java.util.ArrayList;
010 import java.util.List;
011
012 import edu.jas.arith.BigDecimal;
013 import edu.jas.arith.Rational;
014 import edu.jas.poly.GenPolynomial;
015 import edu.jas.root.RealAlgebraicNumber;
016 import edu.jas.structure.GcdRingElem;
017 import edu.jas.structure.RingElem;
018
019
020 /**
021 * Container for Ideals together with univariate polynomials and real algebraic
022 * roots.
023 * @author Heinz Kredel
024 */
025 public class IdealWithRealAlgebraicRoots<C extends RingElem<C> & Rational, D extends GcdRingElem<D> & Rational>
026 extends IdealWithUniv<D> implements Serializable {
027
028
029 /**
030 * The list of real algebraic roots.
031 */
032 public final List<List<RealAlgebraicNumber<D>>> ran;
033
034
035 /**
036 * The list of decimal approximations of the real algebraic roots.
037 */
038 protected List<List<BigDecimal>> droots = null;
039
040
041 /**
042 * Constructor not for use.
043 */
044 protected IdealWithRealAlgebraicRoots() {
045 throw new IllegalArgumentException("do not use this constructor");
046 }
047
048
049 /**
050 * Constructor.
051 * @param id the ideal
052 * @param up the list of univaraite polynomials
053 * @param rr the list of real algebraic roots
054 */
055 public IdealWithRealAlgebraicRoots(Ideal<D> id, List<GenPolynomial<D>> up,
056 List<List<RealAlgebraicNumber<D>>> rr) {
057 super(id, up);
058 ran = rr;
059 }
060
061
062 /**
063 * Constructor.
064 * @param iu the ideal with univariate polynomials
065 * @param rr the list of real algebraic roots
066 */
067 public IdealWithRealAlgebraicRoots(IdealWithUniv<D> iu, List<List<RealAlgebraicNumber<D>>> rr) {
068 super(iu.ideal, iu.upolys);
069 ran = rr;
070 }
071
072
073 /**
074 * String representation of the ideal.
075 * @see java.lang.Object#toString()
076 */
077 @Override
078 public String toString() {
079 StringBuffer sb = new StringBuffer(super.toString() + "\nreal roots:\n");
080 sb.append("[");
081 boolean f1 = true;
082 for (List<RealAlgebraicNumber<D>> lr : ran) {
083 if (!f1) {
084 sb.append(", ");
085 } else {
086 f1 = false;
087 }
088 sb.append("[");
089 boolean f2 = true;
090 for (RealAlgebraicNumber<D> rr : lr) {
091 if (!f2) {
092 sb.append(", ");
093 } else {
094 f2 = false;
095 }
096 sb.append(rr.ring.toScript());
097 }
098 sb.append("]");
099 }
100 sb.append("]");
101 if (droots != null) {
102 sb.append("\ndecimal real root approximation:\n");
103 for (List<BigDecimal> d : droots) {
104 sb.append(d.toString());
105 sb.append("\n");
106 }
107 }
108 return sb.toString();
109 }
110
111
112 /**
113 * Get a scripting compatible string representation.
114 * @return script compatible representation for this Element.
115 * @see edu.jas.structure.Element#toScript()
116 */
117 @Override
118 public String toScript() {
119 // Python case
120 return super.toScript() + ", " + ran.toString();
121 }
122
123
124 /**
125 * Get decimal approximation of the real root tuples.
126 */
127 public synchronized List<List<BigDecimal>> decimalApproximation() {
128 if (this.droots != null) {
129 return droots;
130 }
131 List<List<BigDecimal>> rroots = new ArrayList<List<BigDecimal>>();
132 for (List<RealAlgebraicNumber<D>> rri : this.ran) {
133 List<BigDecimal> r = new ArrayList<BigDecimal>();
134 for (RealAlgebraicNumber<D> rr : rri) {
135 BigDecimal d = new BigDecimal(rr.magnitude());
136 r.add(d);
137 }
138 rroots.add(r);
139 }
140 droots = rroots;
141 return rroots;
142 }
143
144
145 /**
146 * compute decimal approximation of the real root tuples.
147 */
148 public void doDecimalApproximation() {
149 List<List<BigDecimal>> unused = decimalApproximation();
150 return;
151 }
152
153 }