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 }