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 }