001 /* 002 * $Id: GenPolynomialTest.java 2232 2008-12-06 21:56:18Z kredel $ 003 */ 004 005 package edu.jas.poly; 006 007 import java.util.Map; 008 import java.util.List; 009 import java.util.ArrayList; 010 import java.util.Iterator; 011 012 013 import junit.framework.Test; 014 import junit.framework.TestCase; 015 import junit.framework.TestSuite; 016 017 018 import org.apache.log4j.BasicConfigurator; 019 020 021 import edu.jas.arith.BigRational; 022 import edu.jas.arith.BigInteger; 023 024 import edu.jas.poly.ExpVector; 025 import edu.jas.poly.GenPolynomial; 026 import edu.jas.poly.GenPolynomialRing; 027 028 import edu.jas.structure.RingElem; 029 import edu.jas.structure.UnaryFunctor; 030 031 032 /** 033 * GenPolynomial tests with JUnit. 034 * @author Heinz Kredel. 035 */ 036 037 public class GenPolynomialTest extends TestCase { 038 039 /** 040 * main 041 */ 042 public static void main (String[] args) { 043 BasicConfigurator.configure(); 044 junit.textui.TestRunner.run( suite() ); 045 } 046 047 /** 048 * Constructs a <CODE>GenPolynomialTest</CODE> object. 049 * @param name String. 050 */ 051 public GenPolynomialTest(String name) { 052 super(name); 053 } 054 055 /** 056 * suite. 057 */ 058 public static Test suite() { 059 TestSuite suite= new TestSuite(GenPolynomialTest.class); 060 return suite; 061 } 062 063 //private final static int bitlen = 100; 064 065 int rl = 6; 066 int kl = 10; 067 int ll = 7; 068 int el = 4; 069 float q = 0.5f; 070 071 protected void setUp() { 072 // a = b = c = d = e = null; 073 } 074 075 protected void tearDown() { 076 // a = b = c = d = e = null; 077 } 078 079 080 /** 081 * Test constructors and factory. 082 * 083 */ 084 public void testConstructors() { 085 // rational numbers 086 BigRational rf = new BigRational(); 087 // System.out.println("rf = " + rf); 088 089 BigRational r = rf.fromInteger( 99 ); 090 // System.out.println("r = " + r); 091 r = rf.random( 9 ); 092 // System.out.println("r = " + r); 093 094 RingElem<BigRational> re = new BigRational( 3 ); 095 // System.out.println("re = " + re); 096 097 098 // polynomials over rational numbers 099 GenPolynomialRing<BigRational> pf = new GenPolynomialRing<BigRational>(rf,2); 100 // System.out.println("pf = " + pf); 101 102 GenPolynomial<BigRational> p = pf.getONE(); 103 // System.out.println("p = " + p); 104 p = pf.random( 9 ); 105 // System.out.println("p = " + p); 106 p = pf.getZERO(); 107 // System.out.println("p = " + p); 108 109 RingElem< GenPolynomial<BigRational> > pe = new GenPolynomial<BigRational>( pf ); 110 //System.out.println("pe = " + pe); 111 //System.out.println("p.equals(pe) = " + p.equals(pe) ); 112 //System.out.println("p.equals(p) = " + p.equals(p) ); 113 assertTrue("p.equals(pe) = ", p.equals(pe) ); 114 assertTrue("p.equals(p) = ", p.equals(p) ); 115 116 pe = pe.sum( p ); // why not p = p.add(pe) ? 117 //System.out.println("pe = " + pe); 118 p = pf.random( 9 ); 119 p = p.subtract( p ); 120 //System.out.println("p = " + p); 121 //System.out.println("p.isZERO() = " + p.isZERO()); 122 assertTrue("p.isZERO() = ", p.isZERO()); 123 124 125 // polynomials over (polynomials over rational numbers) 126 GenPolynomialRing< GenPolynomial<BigRational> > ppf = new GenPolynomialRing< GenPolynomial<BigRational> >(pf,3); 127 // System.out.println("ppf = " + ppf); 128 129 GenPolynomial< GenPolynomial<BigRational> > pp = ppf.getONE(); 130 // System.out.println("pp = " + pp); 131 pp = ppf.random( 2 ); 132 // System.out.println("pp = " + pp); 133 pp = ppf.getZERO(); 134 // System.out.println("pp = " + pp); 135 136 RingElem< GenPolynomial< GenPolynomial<BigRational> > > ppe = new GenPolynomial< GenPolynomial<BigRational> >( ppf ); 137 // System.out.println("ppe = " + ppe); 138 // System.out.println("pp.equals(ppe) = " + pp.equals(ppe) ); 139 // System.out.println("pp.equals(pp) = " + pp.equals(pp) ); 140 assertTrue("pp.equals(ppe) = ", pp.equals(ppe) ); 141 assertTrue("pp.equals(pp) = ", pp.equals(pp) ); 142 143 ppe = ppe.sum( pp ); // why not pp = pp.add(ppe) ? 144 //System.out.println("ppe = " + ppe); 145 pp = ppf.random( 2 ); 146 pp = pp.subtract( pp ); 147 //System.out.println("pp = " + pp); 148 //System.out.println("pp.isZERO() = " + pp.isZERO()); 149 assertTrue("pp.isZERO() = ", pp.isZERO()); 150 151 152 // polynomials over (polynomials over (polynomials over rational numbers)) 153 GenPolynomialRing< GenPolynomial< GenPolynomial<BigRational> > > pppf = new GenPolynomialRing< GenPolynomial< GenPolynomial<BigRational> > >(ppf,4); 154 // System.out.println("pppf = " + pppf); 155 156 GenPolynomial< GenPolynomial< GenPolynomial<BigRational> > > ppp = pppf.getONE(); 157 //System.out.println("ppp = " + ppp); 158 ppp = pppf.random( 2 ); 159 // System.out.println("ppp = " + ppp); 160 ppp = pppf.getZERO(); 161 // System.out.println("ppp = " + ppp); 162 163 RingElem< GenPolynomial< GenPolynomial< GenPolynomial<BigRational> > > > pppe = new GenPolynomial< GenPolynomial< GenPolynomial<BigRational> > >( pppf ); 164 // System.out.println("pppe = " + pppe); 165 // System.out.println("ppp.equals(pppe) = " + ppp.equals(pppe) ); 166 // System.out.println("ppp.equals(ppp) = " + ppp.equals(ppp) ); 167 assertTrue("ppp.equals(pppe) = ", ppp.equals(pppe) ); 168 assertTrue("ppp.equals(ppp) = ", ppp.equals(ppp) ); 169 170 pppe = pppe.sum( ppp ); // why not ppp = ppp.add(pppe) ? 171 // System.out.println("pppe = " + pppe); 172 ppp = pppf.random( 2 ); 173 ppp = ppp.subtract( ppp ); 174 // System.out.println("ppp = " + ppp); 175 // System.out.println("ppp.isZERO() = " + ppp.isZERO()); 176 assertTrue("ppp.isZERO() = ", ppp.isZERO()); 177 178 // some tests 179 //GenPolynomial<BigRational> pfx = new GenPolynomial<BigRational>(); 180 //System.out.println("pfx = " + pfx); 181 182 } 183 184 185 /** 186 * Test extension and contraction. 187 * 188 */ 189 public void testExtendContract() { 190 // rational numbers 191 BigRational cf = new BigRational( 99 ); 192 // System.out.println("cf = " + cf); 193 194 // polynomials over rational numbers 195 GenPolynomialRing<BigRational> pf = new GenPolynomialRing<BigRational>(cf,rl); 196 // System.out.println("pf = " + pf); 197 198 GenPolynomial<BigRational> a = pf.random(kl,ll,el,q); 199 //System.out.println("a = " + a); 200 201 int k = rl; 202 GenPolynomialRing<BigRational> pfe = pf.extend(k); 203 GenPolynomialRing<BigRational> pfec = pfe.contract(k); 204 assertEquals("pf == pfec",pf,pfec); 205 206 GenPolynomial<BigRational> ae = a.extend(pfe,0,0); 207 208 Map<ExpVector,GenPolynomial<BigRational>> m = ae.contract(pfec); 209 List<GenPolynomial<BigRational>> ml = new ArrayList<GenPolynomial<BigRational>>( m.values() ); 210 GenPolynomial<BigRational> aec = ml.get(0); 211 assertEquals("a == aec",a,aec); 212 //System.out.println("ae = " + ae); 213 //System.out.println("aec = " + aec); 214 } 215 216 217 /** 218 * Test reversion. 219 * 220 */ 221 public void testReverse() { 222 // rational numbers 223 BigRational cf = new BigRational( 99 ); 224 // System.out.println("cf = " + cf); 225 226 // polynomials over rational numbers 227 GenPolynomialRing<BigRational> pf = new GenPolynomialRing<BigRational>(cf,rl); 228 //System.out.println("pf = " + pf); 229 230 GenPolynomial<BigRational> a = pf.random(kl,ll,el,q); 231 //System.out.println("a = " + a); 232 233 int k = rl; 234 GenPolynomialRing<BigRational> pfr = pf.reverse(); 235 GenPolynomialRing<BigRational> pfrr = pfr.reverse(); 236 assertEquals("pf == pfrr",pf,pfrr); 237 //System.out.println("pfr = " + pfr); 238 239 GenPolynomial<BigRational> ar = a.reverse(pfr); 240 GenPolynomial<BigRational> arr = ar.reverse(pfrr); 241 assertEquals("a == arr",a,arr); 242 //System.out.println("ar = " + ar); 243 //System.out.println("arr = " + arr); 244 } 245 246 247 /** 248 * Test accessors. 249 * 250 */ 251 public void testAccessors() { 252 // rational numbers 253 BigRational rf = new BigRational(); 254 // System.out.println("rf = " + rf); 255 256 // polynomials over rational numbers 257 GenPolynomialRing<BigRational> pf 258 = new GenPolynomialRing<BigRational>(rf,rl); 259 // System.out.println("pf = " + pf); 260 261 // test 1 262 GenPolynomial<BigRational> p = pf.getONE(); 263 // System.out.println("p = " + p); 264 265 ExpVector e = p.leadingExpVector(); 266 BigRational c = p.leadingBaseCoefficient(); 267 268 GenPolynomial<BigRational> f 269 = new GenPolynomial<BigRational>(pf,c,e); 270 assertEquals("1 == 1 ",p,f); 271 272 GenPolynomial<BigRational> r = p.reductum(); 273 assertTrue("red(1) == 0 ",r.isZERO()); 274 275 276 // test 0 277 p = pf.getZERO(); 278 // System.out.println("p = " + p); 279 e = p.leadingExpVector(); 280 c = p.leadingBaseCoefficient(); 281 282 f = new GenPolynomial<BigRational>(pf,c,e); 283 assertEquals("0 == 0 ",p,f); 284 285 r = p.reductum(); 286 assertTrue("red(0) == 0 ",r.isZERO()); 287 288 289 // test random 290 p = pf.random(kl,2*ll,el,q); 291 // System.out.println("p = " + p); 292 e = p.leadingExpVector(); 293 c = p.leadingBaseCoefficient(); 294 r = p.reductum(); 295 296 f = new GenPolynomial<BigRational>(pf,c,e); 297 f = r.sum(f); 298 assertEquals("p == lm(f)+red(f) ",p,f); 299 300 301 // test iteration over random 302 GenPolynomial<BigRational> g; 303 g = p; 304 f = pf.getZERO(); 305 while ( !g.isZERO() ) { 306 e = g.leadingExpVector(); 307 c = g.leadingBaseCoefficient(); 308 //System.out.println("c e = " + c + " " + e); 309 r = g.reductum(); 310 f = f.sum(c,e); 311 g = r; 312 } 313 assertEquals("p == lm(f)+lm(red(f))+... ",p,f); 314 } 315 316 317 /** 318 * Test iterators. 319 * 320 */ 321 public void testIterators() { 322 // integers 323 BigInteger rf = new BigInteger(); 324 // System.out.println("rf = " + rf); 325 326 // polynomials over integral numbers 327 GenPolynomialRing<BigInteger> pf 328 = new GenPolynomialRing<BigInteger>(rf,rl); 329 // System.out.println("pf = " + pf); 330 331 // random polynomial 332 GenPolynomial<BigInteger> p = pf.random(kl,2*ll,el,q); 333 //System.out.println("p = " + p); 334 335 // test monomials 336 for ( Monomial<BigInteger> m : p ) { 337 //System.out.println("m = " + m); 338 assertFalse("m.c == 0 ",m.coefficient().isZERO()); 339 assertFalse("m.e < (0) ",m.exponent().signum()<0); 340 } 341 342 // test exponents 343 Iterator<ExpVector> et = p.exponentIterator(); 344 while ( et.hasNext() ) { 345 ExpVector e = et.next(); 346 //System.out.println("e = " + e); 347 assertFalse("e < (0) ", e.signum() < 0); 348 } 349 350 // test coefficents 351 Iterator<BigInteger> ct = p.coefficientIterator(); 352 while ( ct.hasNext() ) { 353 BigInteger i = ct.next(); 354 //System.out.println("i = " + i); 355 assertFalse("i == 0 ", i.isZERO()); 356 } 357 } 358 359 360 /** 361 * Test coefficient map function. 362 * 363 */ 364 public void testMap() { 365 // integers 366 BigInteger rf = new BigInteger(); 367 // System.out.println("rf = " + rf); 368 369 // polynomials over integral numbers 370 GenPolynomialRing<BigInteger> pf 371 = new GenPolynomialRing<BigInteger>(rf,rl); 372 // System.out.println("pf = " + pf); 373 374 // random polynomial 375 GenPolynomial<BigInteger> p = pf.random(kl,2*ll,el,q); 376 //System.out.println("p = " + p); 377 378 // test times 1 379 GenPolynomial<BigInteger> q; 380 q = p.map( new Multiply<BigInteger>( rf.getONE() ) ); 381 assertEquals("p == q ",p,q); 382 383 // test times 0 384 q = p.map( new Multiply<BigInteger>( rf.getZERO() ) ); 385 assertTrue("q == 0 ",q.isZERO()); 386 387 // test times -1 388 q = p.map( new Multiply<BigInteger>( rf.getONE().negate() ) ); 389 assertEquals("p == q ",p.negate(),q); 390 } 391 392 } 393 394 /** 395 * Internal scalar multiplication functor. 396 */ 397 class Multiply<C extends RingElem<C>> implements UnaryFunctor<C,C> { 398 C x; 399 public Multiply(C x) { 400 this.x = x; 401 } 402 public C eval(C c) { 403 return c.multiply(x); 404 } 405 }