001 002 /* 003 * $Id: AlgebraicNumberTest.java 3474 2011-01-08 10:43:28Z kredel $ 004 */ 005 006 package edu.jas.poly; 007 008 import java.util.Iterator; 009 import java.util.Set; 010 import java.util.HashSet; 011 012 import junit.framework.Test; 013 import junit.framework.TestCase; 014 import junit.framework.TestSuite; 015 016 import edu.jas.arith.BigRational; 017 018 //import edu.jas.structure.RingElem; 019 import edu.jas.structure.NotInvertibleException; 020 021 import edu.jas.poly.GenPolynomial; 022 import edu.jas.poly.AlgebraicNumber; 023 import edu.jas.poly.AlgebraicNumberRing; 024 025 026 /** 027 * AlgebraicNumber Test using JUnit. 028 * @author Heinz Kredel. 029 */ 030 031 public class AlgebraicNumberTest extends TestCase { 032 033 /** 034 * main. 035 */ 036 public static void main (String[] args) { 037 junit.textui.TestRunner.run( suite() ); 038 } 039 040 /** 041 * Constructs a <CODE>AlgebraicNumberTest</CODE> object. 042 * @param name String. 043 */ 044 public AlgebraicNumberTest(String name) { 045 super(name); 046 } 047 048 /** 049 * suite. 050 */ 051 public static Test suite() { 052 TestSuite suite= new TestSuite(AlgebraicNumberTest.class); 053 return suite; 054 } 055 056 //private final static int bitlen = 100; 057 058 AlgebraicNumberRing<BigRational> fac; 059 GenPolynomialRing<BigRational> mfac; 060 061 AlgebraicNumber< BigRational > a; 062 AlgebraicNumber< BigRational > b; 063 AlgebraicNumber< BigRational > c; 064 AlgebraicNumber< BigRational > d; 065 AlgebraicNumber< BigRational > e; 066 067 int rl = 1; 068 int kl = 10; 069 int ll = 10; 070 int el = ll; 071 float q = 0.5f; 072 073 protected void setUp() { 074 a = b = c = d = e = null; 075 BigRational bi = new BigRational(1); 076 //bi.setAllIterator(); 077 bi.setNoDuplicatesIterator(); 078 mfac = new GenPolynomialRing<BigRational>( bi, rl ); 079 GenPolynomial<BigRational> mo = mfac.random(kl,ll,7,q); 080 while ( mo.isConstant() ) { 081 mo = mfac.random(kl,ll,5,q); 082 } 083 fac = new AlgebraicNumberRing<BigRational>( mo.monic() ); 084 } 085 086 protected void tearDown() { 087 a = b = c = d = e = null; 088 fac = null; 089 } 090 091 092 /** 093 * Test constructor and toString. 094 * 095 */ 096 public void testConstruction() { 097 c = fac.getONE(); 098 //System.out.println("c = " + c); 099 //System.out.println("c.getVal() = " + c.getVal()); 100 assertTrue("length( c ) = 1", c.getVal().length() == 1); 101 assertTrue("isZERO( c )", !c.isZERO() ); 102 assertTrue("isONE( c )", c.isONE() ); 103 104 d = fac.getZERO(); 105 //System.out.println("d = " + d); 106 //System.out.println("d.getVal() = " + d.getVal()); 107 assertTrue("length( d ) = 0", d.getVal().length() == 0); 108 assertTrue("isZERO( d )", d.isZERO() ); 109 assertTrue("isONE( d )", !d.isONE() ); 110 } 111 112 113 /** 114 * Test random polynomial. 115 * 116 */ 117 public void testRandom() { 118 for (int i = 0; i < 7; i++) { 119 a = fac.random(el); 120 //System.out.println("a = " + a); 121 if ( a.isZERO() || a.isONE() ) { 122 continue; 123 } 124 // fac.random(rl+i, kl*(i+1), ll+2*i, el+i, q ); 125 assertTrue("length( a"+i+" ) <> 0", a.getVal().length() >= 0); 126 assertTrue(" not isZERO( a"+i+" )", !a.isZERO() ); 127 assertTrue(" not isONE( a"+i+" )", !a.isONE() ); 128 } 129 } 130 131 132 /** 133 * Test addition. 134 * 135 */ 136 public void testAddition() { 137 a = fac.random(ll); 138 b = fac.random(ll); 139 140 c = a.sum(b); 141 d = c.subtract(b); 142 assertEquals("a+b-b = a",a,d); 143 144 c = a.sum(b); 145 d = b.sum(a); 146 assertEquals("a+b = b+a",c,d); 147 148 c = fac.random(ll); 149 d = c.sum( a.sum(b) ); 150 e = c.sum( a ).sum(b); 151 assertEquals("c+(a+b) = (c+a)+b",d,e); 152 153 154 c = a.sum( fac.getZERO() ); 155 d = a.subtract( fac.getZERO() ); 156 assertEquals("a+0 = a-0",c,d); 157 158 c = fac.getZERO().sum( a ); 159 d = fac.getZERO().subtract( a.negate() ); 160 assertEquals("0+a = 0+(-a)",c,d); 161 } 162 163 164 /** 165 * Test object multiplication. 166 * 167 */ 168 public void testMultiplication() { 169 a = fac.random(ll); 170 assertTrue("not isZERO( a )", !a.isZERO() ); 171 172 b = fac.random(ll); 173 assertTrue("not isZERO( b )", !b.isZERO() ); 174 175 c = b.multiply(a); 176 d = a.multiply(b); 177 assertTrue("not isZERO( c )", !c.isZERO() ); 178 assertTrue("not isZERO( d )", !d.isZERO() ); 179 180 //System.out.println("a = " + a); 181 //System.out.println("b = " + b); 182 e = d.subtract(c); 183 assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() ); 184 185 assertTrue("a*b = b*a", c.equals(d) ); 186 assertEquals("a*b = b*a",c,d); 187 188 c = fac.random(ll); 189 //System.out.println("c = " + c); 190 d = a.multiply( b.multiply(c) ); 191 e = (a.multiply(b)).multiply(c); 192 193 //System.out.println("d = " + d); 194 //System.out.println("e = " + e); 195 //System.out.println("d-e = " + d.subtract(c) ); 196 197 assertEquals("a(bc) = (ab)c",d,e); 198 assertTrue("a(bc) = (ab)c", d.equals(e) ); 199 200 c = a.multiply( fac.getONE() ); 201 d = fac.getONE().multiply( a ); 202 assertEquals("a*1 = 1*a",c,d); 203 204 c = a.inverse(); 205 d = c.multiply(a); 206 //System.out.println("a = " + a); 207 //System.out.println("c = " + c); 208 //System.out.println("d = " + d); 209 assertEquals("a*1/a = 1",fac.getONE(),d); 210 211 try { 212 a = fac.getZERO().inverse(); 213 fail("0 invertible"); 214 } catch(NotInvertibleException expected) { 215 // ok 216 } 217 218 GenPolynomial<BigRational> dp = fac.modul; 219 GenPolynomial<BigRational> cp = fac.modul.multiply(a.val.monic()); 220 //System.out.println("dp = " + dp); 221 //System.out.println("cp = " + cp); 222 fac = new AlgebraicNumberRing<BigRational>( cp ); 223 a = new AlgebraicNumber<BigRational>(fac,a.val.monic()); 224 assertFalse("a !unit mod m*a", a.isUnit()); 225 226 try { 227 b = a.inverse(); 228 fail("invertible " + a); 229 } catch (AlgebraicNotInvertibleException expected) { 230 //ok 231 //expected.printStackTrace(); 232 //System.out.println("expected = " + expected); 233 assertTrue("f = " + cp, expected.f.equals(cp)); 234 assertTrue("f1 = " + a.val, expected.f1.equals(a.val)); 235 assertTrue("f2 = " + dp, expected.f2.equals(dp)); 236 assertTrue("f = f1*f2 ", expected.f.equals(expected.f1.multiply(expected.f2))); 237 } catch (NotInvertibleException e) { 238 //e.printStackTrace(); 239 fail("wrong exception " + e); 240 } 241 } 242 243 244 /** 245 * Test distributive law. 246 * 247 */ 248 public void testDistributive() { 249 a = fac.random( ll ); 250 b = fac.random( ll ); 251 c = fac.random( ll ); 252 253 d = a.multiply( b.sum(c) ); 254 e = a.multiply( b ).sum( a.multiply(c) ); 255 256 assertEquals("a(b+c) = ab+ac",d,e); 257 } 258 259 260 /** 261 * Test enumerator. 262 * 263 */ 264 public void testEnumerator() { 265 //System.out.println("fac = " + fac); 266 long s = 0L; 267 long t = 0L; 268 Set<AlgebraicNumber<BigRational>> elems = new HashSet<AlgebraicNumber<BigRational>>(49); 269 //Iterator<AlgebraicNumber<BigRational>> iter = fac.iterator(); 270 for ( AlgebraicNumber<BigRational> an : fac ) { 271 t++; 272 if ( elems.contains(an) ) { 273 //System.out.println("dup(an) = " + an); 274 s++; 275 } else { 276 //System.out.println("an = " + an); 277 elems.add(an); 278 } 279 if ( t >= 100 ) { 280 break; 281 } 282 } 283 //System.out.println("elems = " + elems); 284 assertTrue("#elems " + t + ", t = " + elems.size(), t == elems.size() ); 285 assertTrue("#elems " + t + ", t = " + elems.size(), s == 0L ); 286 } 287 288 }