001 /* 002 * $Id: SquarefreeIntTest.java 2933 2009-12-29 13:13:34Z kredel $ 003 */ 004 005 package edu.jas.ufd; 006 007 008 import java.util.SortedMap; 009 010 import junit.framework.Test; 011 import junit.framework.TestCase; 012 import junit.framework.TestSuite; 013 014 import edu.jas.arith.BigInteger; 015 import edu.jas.kern.ComputerThreads; 016 import edu.jas.poly.ExpVector; 017 import edu.jas.poly.GenPolynomial; 018 import edu.jas.poly.GenPolynomialRing; 019 import edu.jas.poly.PolyUtil; 020 import edu.jas.poly.TermOrder; 021 022 023 /** 024 * Squarefree factorization tests with JUnit. 025 * @author Heinz Kredel. 026 */ 027 028 public class SquarefreeIntTest extends TestCase { 029 030 031 /** 032 * main. 033 */ 034 public static void main(String[] args) { 035 //BasicConfigurator.configure(); 036 junit.textui.TestRunner.run(suite()); 037 ComputerThreads.terminate(); 038 } 039 040 041 /** 042 * Constructs a <CODE>SquarefreeIntTest</CODE> object. 043 * @param name String. 044 */ 045 public SquarefreeIntTest(String name) { 046 super(name); 047 } 048 049 050 /** 051 */ 052 public static Test suite() { 053 TestSuite suite = new TestSuite(SquarefreeIntTest.class); 054 return suite; 055 } 056 057 058 TermOrder to = new TermOrder(TermOrder.INVLEX); 059 060 061 int rl = 3; 062 063 064 int kl = 7; 065 066 067 int ll = 4; 068 069 070 int el = 3; 071 072 073 float q = 0.25f; 074 075 076 String[] vars; 077 078 079 String[] cvars; 080 081 082 String[] c1vars; 083 084 085 String[] rvars; 086 087 088 BigInteger fac; 089 090 091 GreatestCommonDivisorAbstract<BigInteger> ufd; 092 093 094 SquarefreeRingChar0<BigInteger> sqf; 095 096 097 GenPolynomialRing<BigInteger> dfac; 098 099 100 GenPolynomial<BigInteger> a; 101 102 103 GenPolynomial<BigInteger> b; 104 105 106 GenPolynomial<BigInteger> c; 107 108 109 GenPolynomial<BigInteger> d; 110 111 112 GenPolynomial<BigInteger> e; 113 114 115 GenPolynomialRing<BigInteger> cfac; 116 117 118 GenPolynomialRing<GenPolynomial<BigInteger>> rfac; 119 120 121 GenPolynomial<GenPolynomial<BigInteger>> ar; 122 123 124 GenPolynomial<GenPolynomial<BigInteger>> br; 125 126 127 GenPolynomial<GenPolynomial<BigInteger>> cr; 128 129 130 GenPolynomial<GenPolynomial<BigInteger>> dr; 131 132 133 GenPolynomial<GenPolynomial<BigInteger>> er; 134 135 136 @Override 137 protected void setUp() { 138 vars = ExpVector.STDVARS(rl); 139 cvars = ExpVector.STDVARS(rl - 1); 140 c1vars = new String[] { cvars[0] }; 141 rvars = new String[] { vars[rl - 1] }; 142 143 fac = new BigInteger(1); 144 145 //ufd = new GreatestCommonDivisorSubres<BigInteger>(); 146 //ufd = GCDFactory.<BigInteger> getImplementation(fac); 147 ufd = GCDFactory.getProxy(fac); 148 149 sqf = new SquarefreeRingChar0<BigInteger>(fac); 150 151 SquarefreeAbstract<BigInteger> sqff = SquarefreeFactory.getImplementation(fac); 152 //System.out.println("sqf = " + sqf); 153 //System.out.println("sqff = " + sqff); 154 assertEquals("sqf == sqff ", sqf.getClass(), sqff.getClass()); 155 156 a = b = c = d = e = null; 157 ar = br = cr = dr = er = null; 158 } 159 160 161 @Override 162 protected void tearDown() { 163 a = b = c = d = e = null; 164 ar = br = cr = dr = er = null; 165 //ComputerThreads.terminate(); 166 } 167 168 169 /** 170 * Test base squarefree. 171 * 172 */ 173 public void testBaseSquarefree() { 174 //System.out.println("\nbase:"); 175 176 dfac = new GenPolynomialRing<BigInteger>(fac, 1, to, rvars); 177 178 a = dfac.random(kl, ll, el + 2, q); 179 b = dfac.random(kl, ll, el + 2, q); 180 c = dfac.random(kl, ll, el, q); 181 //System.out.println("a = " + a); 182 //System.out.println("b = " + b); 183 //System.out.println("c = " + c); 184 185 if (a.isZERO() || b.isZERO() || c.isZERO()) { 186 // skip for this turn 187 return; 188 } 189 190 // a a b b b c 191 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c); 192 c = a.multiply(b).multiply(c); 193 //System.out.println("d = " + d); 194 //System.out.println("c = " + c); 195 196 c = sqf.baseSquarefreePart(c); 197 d = sqf.baseSquarefreePart(d); 198 //System.out.println("d = " + d); 199 //System.out.println("c = " + c); 200 assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c)); 201 assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d)); 202 203 e = PolyUtil.<BigInteger> basePseudoRemainder(d, c); 204 //System.out.println("e = " + e); 205 assertTrue("squarefree(abc) | squarefree(aabbbc) " + e, e.isZERO()); 206 } 207 208 209 /** 210 * Test base squarefree factors. 211 * 212 */ 213 public void testBaseSquarefreeFactors() { 214 215 dfac = new GenPolynomialRing<BigInteger>(fac, 1, to, rvars); 216 217 a = dfac.random(kl, ll, el + 3, q); 218 b = dfac.random(kl, ll, el + 3, q); 219 c = dfac.random(kl, ll, el + 2, q); 220 //System.out.println("a = " + a); 221 //System.out.println("b = " + b); 222 //System.out.println("c = " + c); 223 224 if (a.isZERO() || b.isZERO() || c.isZERO()) { 225 // skip for this turn 226 return; 227 } 228 229 // a a b b b c 230 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c); 231 //System.out.println("d = " + d); 232 233 SortedMap<GenPolynomial<BigInteger>, Long> sfactors; 234 sfactors = sqf.baseSquarefreeFactors(d); 235 //System.out.println("sfactors = " + sfactors); 236 237 assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors)); 238 } 239 240 241 /** 242 * Test recursive squarefree. 243 * 244 */ 245 public void testRecursiveSquarefree() { 246 //System.out.println("\nrecursive:"); 247 248 cfac = new GenPolynomialRing<BigInteger>(fac, 2 - 1, to, c1vars); 249 rfac = new GenPolynomialRing<GenPolynomial<BigInteger>>(cfac, 1, to, rvars); 250 251 ar = rfac.random(kl, ll, el, q); 252 br = rfac.random(kl, ll, el, q); 253 cr = rfac.random(kl, ll, el, q); 254 //System.out.println("ar = " + ar); 255 //System.out.println("br = " + br); 256 //System.out.println("cr = " + cr); 257 258 if (ar.isZERO() || br.isZERO() || cr.isZERO()) { 259 // skip for this turn 260 return; 261 } 262 263 dr = ar.multiply(ar).multiply(br).multiply(br); 264 cr = ar.multiply(br); 265 //System.out.println("dr = " + dr); 266 //System.out.println("cr = " + cr); 267 268 cr = sqf.recursiveUnivariateSquarefreePart(cr); 269 dr = sqf.recursiveUnivariateSquarefreePart(dr); 270 //System.out.println("dr = " + dr); 271 //System.out.println("cr = " + cr); 272 assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr)); 273 assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr)); 274 275 er = PolyUtil.<BigInteger> recursivePseudoRemainder(dr, cr); 276 //System.out.println("er = " + er); 277 assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO()); 278 } 279 280 281 /** 282 * Test recursive squarefree factors. 283 * 284 */ 285 public void testRecursiveSquarefreeFactors() { 286 287 cfac = new GenPolynomialRing<BigInteger>(fac, 2 - 1, to, c1vars); 288 rfac = new GenPolynomialRing<GenPolynomial<BigInteger>>(cfac, 1, to, rvars); 289 290 ar = rfac.random(kl, 3, 2, q); 291 br = rfac.random(kl, 3, 2, q); 292 cr = rfac.random(kl, 3, 2, q); 293 //System.out.println("ar = " + ar); 294 //System.out.println("br = " + br); 295 //System.out.println("cr = " + cr); 296 297 if (ar.isZERO() || br.isZERO() || cr.isZERO()) { 298 // skip for this turn 299 return; 300 } 301 302 dr = ar.multiply(cr).multiply(br).multiply(br); 303 //System.out.println("dr = " + dr); 304 305 SortedMap<GenPolynomial<GenPolynomial<BigInteger>>, Long> sfactors; 306 sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr); 307 //System.out.println("sfactors = " + sfactors); 308 309 assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors)); 310 } 311 312 313 /** 314 * Test squarefree. 315 * 316 */ 317 public void testSquarefree() { 318 //System.out.println("\nfull:"); 319 320 dfac = new GenPolynomialRing<BigInteger>(fac, rl, to, vars); 321 322 a = dfac.random(kl, ll, 2, q); 323 b = dfac.random(kl, ll, 2, q); 324 c = dfac.random(kl, ll, 2, q); 325 //System.out.println("a = " + a); 326 //System.out.println("b = " + b); 327 //System.out.println("c = " + c); 328 329 if (a.isZERO() || b.isZERO() || c.isZERO()) { 330 // skip for this turn 331 return; 332 } 333 334 d = a.multiply(a).multiply(b).multiply(b).multiply(c); 335 c = a.multiply(b).multiply(c); 336 //System.out.println("d = " + d); 337 //System.out.println("c = " + c); 338 339 c = sqf.squarefreePart(c); 340 d = sqf.squarefreePart(d); 341 //System.out.println("c = " + c); 342 //System.out.println("d = " + d); 343 assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d)); 344 assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c)); 345 346 e = PolyUtil.<BigInteger> basePseudoRemainder(d, c); 347 //System.out.println("e = " + e); 348 assertTrue("squarefree(abc) | squarefree(aabbc) " + e, e.isZERO()); 349 } 350 351 352 /** 353 * Test squarefree factors. 354 * 355 */ 356 public void testSquarefreeFactors() { 357 358 dfac = new GenPolynomialRing<BigInteger>(fac, rl, to, vars); 359 360 a = dfac.random(kl, 3, 2, q); 361 b = dfac.random(kl, 3, 2, q); 362 c = dfac.random(kl, 3, 2, q); 363 //System.out.println("a = " + a); 364 //System.out.println("b = " + b); 365 //System.out.println("c = " + c); 366 367 if (a.isZERO() || b.isZERO() || c.isZERO()) { 368 // skip for this turn 369 return; 370 } 371 372 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c); 373 //System.out.println("d = " + d); 374 375 SortedMap<GenPolynomial<BigInteger>, Long> sfactors; 376 sfactors = sqf.squarefreeFactors(d); 377 //System.out.println("sfactors = " + sfactors); 378 379 assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors)); 380 } 381 382 }