001/* 002 * $Id: SquarefreeRatTest.java 5863 2018-07-20 11:13:34Z kredel $ 003 */ 004 005package edu.jas.ufd; 006 007 008import java.util.SortedMap; 009 010import junit.framework.Test; 011import junit.framework.TestCase; 012import junit.framework.TestSuite; 013 014import edu.jas.arith.BigRational; 015import edu.jas.kern.ComputerThreads; 016import edu.jas.poly.ExpVector; 017import edu.jas.poly.GenPolynomial; 018import edu.jas.poly.GenPolynomialRing; 019import edu.jas.poly.PolyUtil; 020import edu.jas.poly.TermOrder; 021 022 023/** 024 * Squarefree factorization 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; 100 101 102 GenPolynomial<BigRational> b; 103 104 105 GenPolynomial<BigRational> c; 106 107 108 GenPolynomial<BigRational> d; 109 110 111 GenPolynomial<BigRational> e; 112 113 114 GenPolynomialRing<BigRational> cfac; 115 116 117 GenPolynomialRing<GenPolynomial<BigRational>> rfac; 118 119 120 GenPolynomial<GenPolynomial<BigRational>> ar; 121 122 123 GenPolynomial<GenPolynomial<BigRational>> br; 124 125 126 GenPolynomial<GenPolynomial<BigRational>> cr; 127 128 129 GenPolynomial<GenPolynomial<BigRational>> dr; 130 131 132 GenPolynomial<GenPolynomial<BigRational>> er; 133 134 135 @Override 136 protected void setUp() { 137 vars = ExpVector.STDVARS(rl); 138 cvars = ExpVector.STDVARS(rl - 1); 139 c1vars = new String[] { cvars[0] }; 140 rvars = new String[] { vars[rl - 1] }; 141 fac = new BigRational(1); 142 //ufd = new GreatestCommonDivisorSubres<BigRational>(); 143 //ufd = GCDFactory.<BigRational> getImplementation(fac); 144 ufd = GCDFactory.getProxy(fac); 145 sqf = new SquarefreeFieldChar0<BigRational>(fac); 146 147 SquarefreeAbstract<BigRational> sqff = SquarefreeFactory.getImplementation(fac); 148 //System.out.println("sqf = " + sqf); 149 //System.out.println("sqff = " + sqff); 150 assertEquals("sqf == sqff ", sqf.getClass(), sqff.getClass()); 151 152 a = b = c = d = e = null; 153 ar = br = cr = dr = er = null; 154 } 155 156 157 @Override 158 protected void tearDown() { 159 a = b = c = d = e = null; 160 ar = br = cr = dr = er = null; 161 // ComputerThreads.terminate(); 162 } 163 164 165 /** 166 * Test base squarefree. 167 * 168 */ 169 public void testBaseSquarefree() { 170 //System.out.println("\nbase:"); 171 172 dfac = new GenPolynomialRing<BigRational>(fac, 1, to, rvars); 173 174 a = dfac.random(kl, ll, el + 2, q); 175 b = dfac.random(kl, ll, el + 2, q); 176 c = dfac.random(kl, ll, el, q); 177 //System.out.println("a = " + a); 178 //System.out.println("b = " + b); 179 //System.out.println("c = " + c); 180 181 if (a.isZERO() || b.isZERO() || c.isZERO()) { 182 // skip for this turn 183 return; 184 } 185 186 // a a b b b c 187 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c); 188 c = a.multiply(b).multiply(c); 189 //System.out.println("d = " + d); 190 //System.out.println("c = " + c); 191 192 c = sqf.baseSquarefreePart(c); 193 d = sqf.baseSquarefreePart(d); 194 //System.out.println("d = " + d); 195 //System.out.println("c = " + c); 196 assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c)); 197 assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d)); 198 199 e = PolyUtil.<BigRational> basePseudoRemainder(d, c); 200 //System.out.println("e = " + e); 201 assertTrue("squarefree(abc) | squarefree(aabbbc) " + e, e.isZERO()); 202 } 203 204 205 /** 206 * Test base squarefree factors. 207 * 208 */ 209 public void testBaseSquarefreeFactors() { 210 211 dfac = new GenPolynomialRing<BigRational>(fac, 1, to, rvars); 212 213 a = dfac.random(kl, ll, el + 3, q); 214 b = dfac.random(kl, ll, el + 3, q); 215 c = dfac.random(kl, ll, el + 2, q); 216 //System.out.println("a = " + a); 217 //System.out.println("b = " + b); 218 //System.out.println("c = " + c); 219 220 if (a.isZERO() || b.isZERO() || c.isZERO()) { 221 // skip for this turn 222 return; 223 } 224 225 // a a b b b c 226 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c); 227 //System.out.println("d = " + d); 228 229 SortedMap<GenPolynomial<BigRational>, Long> sfactors; 230 sfactors = sqf.baseSquarefreeFactors(d); 231 //System.out.println("sfactors = " + sfactors); 232 233 assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors)); 234 } 235 236 237 /** 238 * Test recursive squarefree. 239 * 240 */ 241 public void testRecursiveSquarefree() { 242 //System.out.println("\nrecursive:"); 243 244 cfac = new GenPolynomialRing<BigRational>(fac, 2 - 1, to, c1vars); 245 rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(cfac, 1, to, rvars); 246 247 ar = rfac.random(kl, ll, el, q); 248 br = rfac.random(kl, ll, el, q); 249 cr = rfac.random(kl, ll, el, q); 250 //System.out.println("ar = " + ar); 251 //System.out.println("br = " + br); 252 //System.out.println("cr = " + cr); 253 254 if (ar.isZERO() || br.isZERO() || cr.isZERO()) { 255 // skip for this turn 256 return; 257 } 258 259 dr = ar.multiply(ar).multiply(br).multiply(br); 260 cr = ar.multiply(br); 261 //System.out.println("dr = " + dr); 262 //System.out.println("cr = " + cr); 263 264 cr = sqf.recursiveUnivariateSquarefreePart(cr); 265 dr = sqf.recursiveUnivariateSquarefreePart(dr); 266 //System.out.println("dr = " + dr); 267 //System.out.println("cr = " + cr); 268 assertTrue("isSquarefree(cr) " + cr, sqf.isRecursiveSquarefree(cr)); 269 assertTrue("isSquarefree(dr) " + dr, sqf.isRecursiveSquarefree(dr)); 270 271 er = PolyUtil.<BigRational> recursivePseudoRemainder(dr, cr); 272 //System.out.println("er = " + er); 273 assertTrue("squarefree(abc) | squarefree(aabbc) " + er, er.isZERO()); 274 } 275 276 277 /** 278 * Test recursive squarefree factors. 279 * 280 */ 281 public void testRecursiveSquarefreeFactors() { 282 283 cfac = new GenPolynomialRing<BigRational>(fac, 2 - 1, to, c1vars); 284 rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(cfac, 1, to, rvars); 285 286 ar = rfac.random(kl, 3, 2, q); 287 br = rfac.random(kl, 3, 2, q); 288 cr = rfac.random(kl, 3, 2, q); 289 //System.out.println("ar = " + ar); 290 //System.out.println("br = " + br); 291 //System.out.println("cr = " + cr); 292 293 if (ar.isZERO() || br.isZERO() || cr.isZERO()) { 294 // skip for this turn 295 return; 296 } 297 298 dr = ar.multiply(cr).multiply(br).multiply(br); 299 //System.out.println("dr = " + dr); 300 301 SortedMap<GenPolynomial<GenPolynomial<BigRational>>, Long> sfactors; 302 sfactors = sqf.recursiveUnivariateSquarefreeFactors(dr); 303 //System.out.println("sfactors = " + sfactors); 304 assertTrue("isFactorization(d,sfactors) ", sqf.isRecursiveFactorization(dr, sfactors)); 305 } 306 307 308 /** 309 * Test squarefree. 310 * 311 */ 312 public void testSquarefree() { 313 //System.out.println("\nfull:"); 314 315 dfac = new GenPolynomialRing<BigRational>(fac, rl, to, vars); 316 317 a = dfac.random(kl, ll, 2, q); 318 b = dfac.random(kl, ll, 2, q); 319 c = dfac.random(kl, ll, 2, q); 320 //System.out.println("a = " + a); 321 //System.out.println("b = " + b); 322 //System.out.println("c = " + c); 323 324 if (a.isZERO() || b.isZERO() || c.isZERO()) { 325 // skip for this turn 326 return; 327 } 328 329 d = a.multiply(a).multiply(b).multiply(b).multiply(c); 330 c = a.multiply(b).multiply(c); 331 //System.out.println("d = " + d); 332 //System.out.println("c = " + c); 333 334 c = sqf.squarefreePart(c); 335 d = sqf.squarefreePart(d); 336 //System.out.println("c = " + c); 337 //System.out.println("d = " + d); 338 assertTrue("isSquarefree(d) " + d, sqf.isSquarefree(d)); 339 assertTrue("isSquarefree(c) " + c, sqf.isSquarefree(c)); 340 341 e = PolyUtil.<BigRational> basePseudoRemainder(d, c); 342 //System.out.println("e = " + e); 343 assertTrue("squarefree(abc) | squarefree(aabbc) " + e, e.isZERO()); 344 } 345 346 347 /** 348 * Test squarefree factors. 349 * 350 */ 351 public void testSquarefreeFactors() { 352 353 dfac = new GenPolynomialRing<BigRational>(fac, rl, to, vars); 354 355 a = dfac.random(kl, 3, 2, q); 356 b = dfac.random(kl, 3, 2, q); 357 c = dfac.random(kl, 3, 2, q); 358 //System.out.println("a = " + a); 359 //System.out.println("b = " + b); 360 //System.out.println("c = " + c); 361 362 if (a.isZERO() || b.isZERO() || c.isZERO()) { 363 // skip for this turn 364 return; 365 } 366 367 d = a.multiply(a).multiply(b).multiply(b).multiply(b).multiply(c); 368 //System.out.println("d = " + d); 369 370 SortedMap<GenPolynomial<BigRational>, Long> sfactors; 371 sfactors = sqf.squarefreeFactors(d); 372 //System.out.println("sfactors = " + sfactors); 373 assertTrue("isFactorization(d,sfactors) ", sqf.isFactorization(d, sfactors)); 374 } 375 376}