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