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