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