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 }