001 /* 002 * $Id: OrderedPolynomialList.java 2921 2009-12-25 17:06:56Z kredel $ 003 */ 004 005 package edu.jas.poly; 006 007 import java.util.List; 008 import java.util.ArrayList; 009 import java.util.Arrays; 010 //import java.util.Iterator; 011 //import java.util.Map; 012 //import java.util.TreeMap; 013 import java.util.Comparator; 014 015 //import java.io.Serializable; 016 017 import edu.jas.structure.RingElem; 018 //import edu.jas.structure.RingFactory; 019 020 //import edu.jas.arith.BigRational; 021 022 import edu.jas.poly.ExpVector; 023 import edu.jas.poly.GenPolynomialRing; 024 025 026 /** 027 * Ordered list of polynomials. 028 * Mainly for storage and printing / toString and 029 * conversions to other representations. 030 * Polynomials in this list are sorted according to their head terms. 031 * @author Heinz Kredel 032 */ 033 034 public class OrderedPolynomialList<C extends RingElem<C> > 035 extends PolynomialList<C> { 036 037 038 /** 039 * Constructor. 040 * @param r polynomial ring factory. 041 * @param l list of polynomials. 042 */ 043 public OrderedPolynomialList( GenPolynomialRing< C > r, 044 List< GenPolynomial< C > > l ) { 045 super(r, sort(r,l) ); 046 } 047 048 049 /** Comparison with any other object. 050 * @see java.lang.Object#equals(java.lang.Object) 051 */ 052 @Override 053 @SuppressWarnings("unchecked") // not jet working 054 public boolean equals(Object p) { 055 if ( ! super.equals(p) ) { 056 return false; 057 } 058 OrderedPolynomialList< C > pl = null; 059 try { 060 pl = (OrderedPolynomialList< C >)p; 061 } catch (ClassCastException ignored) { 062 } 063 if ( pl == null ) { 064 return false; 065 } 066 // compare sorted lists 067 // done already in super.equals() 068 return true; 069 } 070 071 072 /** 073 * Sort a list of polynomials with respect to the ascending order 074 * of the leading Exponent vectors. 075 * The term order is taken from the ring. 076 * @param r polynomial ring factory. 077 * @param l polynomial list. 078 * @return sorted polynomial list from l. 079 */ 080 public static <C extends RingElem<C> > 081 List<GenPolynomial<C>> sort( GenPolynomialRing< C > r, 082 List<GenPolynomial<C>> l ) { 083 if ( l == null ) { 084 return l; 085 } 086 if ( l.size() <= 1 ) { // nothing to sort 087 return l; 088 } 089 final Comparator<ExpVector> evc = r.tord.getAscendComparator(); 090 Comparator<GenPolynomial<C>> cmp = new Comparator<GenPolynomial<C>>() { 091 public int compare(GenPolynomial<C> p1, 092 GenPolynomial<C> p2) { 093 ExpVector e1 = p1.leadingExpVector(); 094 ExpVector e2 = p2.leadingExpVector(); 095 if ( e1 == null ) { 096 return -1; // dont care 097 } 098 if ( e2 == null ) { 099 return 1; // dont care 100 } 101 if ( e1.length() != e2.length() ) { 102 if ( e1.length() > e2.length() ) { 103 return 1; // dont care 104 } else { 105 return -1; // dont care 106 } 107 } 108 return evc.compare(e1,e2); 109 } 110 }; 111 GenPolynomial<C>[] s = null; 112 try { 113 s = (GenPolynomial<C>[]) new GenPolynomial[ l.size() ]; 114 //System.out.println("s.length = " + s.length ); 115 //s = l.toArray(s); does not work 116 //for ( int i = 0; i < l.size(); i++ ) { 117 // s[i] = l.get(i); 118 //} 119 int i = 0; 120 for ( GenPolynomial<C> p : l ) { 121 s[i++] = p; 122 } 123 Arrays.<GenPolynomial<C>>sort( s, cmp ); 124 return new ArrayList<GenPolynomial<C>>( 125 Arrays.<GenPolynomial<C>>asList(s) ); 126 } catch(ClassCastException ok) { 127 System.out.println("Warning: polynomials not sorted"); 128 } 129 return l; // unsorted 130 } 131 132 }