001/* 002 * $Id$ 003 */ 004 005package edu.jas.ufd; 006 007 008import java.util.SortedMap; 009 010import edu.jas.arith.BigRational; 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 BigRational coefficients tests with JUnit. 025 * @author Heinz Kredel 026 */ 027 028public class SquarefreeRatTest 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>SquarefreeRatTest</CODE> object. 042 * @param name String. 043 */ 044 public SquarefreeRatTest(String name) { 045 super(name); 046 } 047 048 049 /** 050 */ 051 public static Test suite() { 052 TestSuite suite = new TestSuite(SquarefreeRatTest.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 = 3; 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 BigRational fac; 088 089 090 GreatestCommonDivisorAbstract<BigRational> ufd; 091 092 093 SquarefreeFieldChar0<BigRational> sqf; 094 095 096 GenPolynomialRing<BigRational> dfac; 097 098 099 GenPolynomial<BigRational> a, b, c, d, e; 100 101 102 GenPolynomialRing<BigRational> cfac; 103 104 105 GenPolynomialRing<GenPolynomial<BigRational>> rfac; 106 107 108 GenPolynomial<GenPolynomial<BigRational>> 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 fac = new BigRational(1); 118 //ufd = new GreatestCommonDivisorSubres<BigRational>(); 119 //ufd = GCDFactory.<BigRational> getImplementation(fac); 120 ufd = GCDFactory.getProxy(fac); 121 sqf = new SquarefreeFieldChar0<BigRational>(fac); 122 123 SquarefreeAbstract<BigRational> sqff = SquarefreeFactory.getImplementation(fac); 124 //System.out.println("sqf = " + sqf); 125 //System.out.println("sqff = " + sqff); 126 assertEquals("sqf == sqff ", sqf.getClass(), sqff.getClass()); 127 128 a = b = c = d = e = null; 129 ar = br = cr = dr = er = null; 130 } 131 132 133 @Override 134 protected void tearDown() { 135 a = b = c = d = e = null; 136 ar = br = cr = dr = er = null; 137 // ComputerThreads.terminate(); 138 } 139 140 141 /** 142 * Test base squarefree. 143 * 144 */ 145 public void testBaseSquarefree() { 146 //System.out.println("\nbase:"); 147 148 dfac = new GenPolynomialRing<BigRational>(fac, 1, to, rvars); 149 150 a = dfac.random(kl, ll, el + 2, q); 151 b = dfac.random(kl, ll, el + 2, q); 152 c = dfac.random(kl, ll, el, q); 153 //System.out.println("a = " + a); 154 //System.out.println("b = " + b); 155 //System.out.println("c = " + c); 156 157 if (a.isZERO() || b.isZERO() || c.isZERO()) { 158 // skip for this turn 159 return; 160 } 161 162 // a a b b b c 163 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c); 164 c = a.multiply(b).multiply(c); 165 //System.out.println("d = " + d); 166 //System.out.println("c = " + c); 167 168 c = sqf.baseSquarefreePart(c); 169 d = sqf.baseSquarefreePart(d); 170 //System.out.println("d = " + d); 171 //System.out.println("c = " + c); 172 assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c)); 173 assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d)); 174 175 e = PolyUtil.<BigRational> baseSparsePseudoRemainder(d, c); 176 //System.out.println("e = " + e); 177 assertTrue("squarefree(abc) | squarefree(aabbbc) " + e, e.isZERO()); 178 } 179 180 181 /** 182 * Test base squarefree factors. 183 * 184 */ 185 public void testBaseSquarefreeFactors() { 186 187 dfac = new GenPolynomialRing<BigRational>(fac, 1, to, rvars); 188 189 a = dfac.random(kl, ll, el + 3, q); 190 b = dfac.random(kl, ll, el + 3, q); 191 c = dfac.random(kl, ll, el + 2, q); 192 //System.out.println("a = " + a); 193 //System.out.println("b = " + b); 194 //System.out.println("c = " + c); 195 196 if (a.isZERO() || b.isZERO() || c.isZERO()) { 197 // skip for this turn 198 return; 199 } 200 201 // a a b b b c 202 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c); 203 //System.out.println("d = " + d); 204 205 SortedMap<GenPolynomial<BigRational>, Long> sfactors; 206 sfactors = sqf.baseSquarefreeFactors(d); 207 //System.out.println("sfactors = " + sfactors); 208 209 assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors)); 210 } 211 212 213 /** 214 * Test recursive squarefree. 215 * 216 */ 217 public void testRecursiveSquarefree() { 218 //System.out.println("\nrecursive:"); 219 220 cfac = new GenPolynomialRing<BigRational>(fac, 2 - 1, to, c1vars); 221 rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(cfac, 1, to, rvars); 222 223 ar = rfac.random(kl, ll, el, q); 224 br = rfac.random(kl, ll, el, q); 225 cr = rfac.random(kl, ll, el, q); 226 //System.out.println("ar = " + ar); 227 //System.out.println("br = " + br); 228 //System.out.println("cr = " + cr); 229 230 if (ar.isZERO() || br.isZERO() || cr.isZERO()) { 231 // skip for this turn 232 return; 233 } 234 235 dr = ar.multiply(ar).multiply(br).multiply(br); 236 cr = ar.multiply(br); 237 //System.out.println("dr = " + dr); 238 //System.out.println("cr = " + cr); 239 240 cr = sqf.recursiveUnivariateSquarefreePart(cr); 241 dr = sqf.recursiveUnivariateSquarefreePart(dr); 242 //System.out.println("dr = " + dr); 243 //System.out.println("cr = " + cr); 244 assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr)); 245 assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr)); 246 247 er = PolyUtil.<BigRational> recursiveSparsePseudoRemainder(dr, cr); 248 //System.out.println("er = " + er); 249 assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO()); 250 } 251 252 253 /** 254 * Test recursive squarefree factors. 255 * 256 */ 257 public void testRecursiveSquarefreeFactors() { 258 259 cfac = new GenPolynomialRing<BigRational>(fac, 2 - 1, to, c1vars); 260 rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(cfac, 1, to, rvars); 261 262 ar = rfac.random(kl, 3, 2, q); 263 br = rfac.random(kl, 3, 2, q); 264 cr = rfac.random(kl, 3, 2, q); 265 //System.out.println("ar = " + ar); 266 //System.out.println("br = " + br); 267 //System.out.println("cr = " + cr); 268 269 if (ar.isZERO() || br.isZERO() || cr.isZERO()) { 270 // skip for this turn 271 return; 272 } 273 274 dr = ar.multiply(cr).multiply(br).multiply(br); 275 //System.out.println("dr = " + dr); 276 277 SortedMap<GenPolynomial<GenPolynomial<BigRational>>, Long> sfactors; 278 sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr); 279 //System.out.println("sfactors = " + sfactors); 280 assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors)); 281 } 282 283 284 /** 285 * Test squarefree. 286 * 287 */ 288 public void testSquarefree() { 289 //System.out.println("\nfull:"); 290 291 dfac = new GenPolynomialRing<BigRational>(fac, rl, to, vars); 292 293 a = dfac.random(kl, ll, 2, q); 294 b = dfac.random(kl, ll, 2, q); 295 c = dfac.random(kl, ll, 2, q); 296 //System.out.println("a = " + a); 297 //System.out.println("b = " + b); 298 //System.out.println("c = " + c); 299 300 if (a.isZERO() || b.isZERO() || c.isZERO()) { 301 // skip for this turn 302 return; 303 } 304 305 d = a.multiply(a).multiply(b).multiply(b).multiply(c); 306 c = a.multiply(b).multiply(c); 307 //System.out.println("d = " + d); 308 //System.out.println("c = " + c); 309 310 c = sqf.squarefreePart(c); 311 d = sqf.squarefreePart(d); 312 //System.out.println("c = " + c); 313 //System.out.println("d = " + d); 314 assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d)); 315 assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c)); 316 317 e = PolyUtil.<BigRational> baseSparsePseudoRemainder(d, c); 318 //System.out.println("e = " + e); 319 assertTrue("squarefree(abc) | squarefree(aabbc) " + e, e.isZERO()); 320 } 321 322 323 /** 324 * Test squarefree factors. 325 * 326 */ 327 public void testSquarefreeFactors() { 328 329 dfac = new GenPolynomialRing<BigRational>(fac, rl, to, vars); 330 331 a = dfac.random(kl, 3, 2, q); 332 b = dfac.random(kl, 3, 2, q); 333 c = dfac.random(kl, 3, 2, q); 334 //System.out.println("a = " + a); 335 //System.out.println("b = " + b); 336 //System.out.println("c = " + c); 337 338 if (a.isZERO() || b.isZERO() || c.isZERO()) { 339 // skip for this turn 340 return; 341 } 342 343 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c); 344 //System.out.println("d = " + d); 345 346 SortedMap<GenPolynomial<BigRational>, Long> sfactors; 347 sfactors = sqf.squarefreeFactors(d); 348 //System.out.println("sfactors = " + sfactors); 349 assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors)); 350 } 351 352}