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