001/* 002 * $Id$ 003 */ 004 005package edu.jas.ufd; 006 007 008import edu.jas.arith.BigInteger; 009import edu.jas.arith.BigRational; 010import edu.jas.arith.ModInteger; 011import edu.jas.arith.ModIntegerRing; 012import edu.jas.arith.ModLong; 013import edu.jas.arith.ModLongRing; 014import edu.jas.kern.ComputerThreads; 015import edu.jas.poly.AlgebraicNumber; 016import edu.jas.poly.AlgebraicNumberRing; 017import edu.jas.poly.GenPolynomial; 018import edu.jas.poly.GenPolynomialRing; 019import edu.jas.poly.TermOrder; 020import edu.jas.structure.RingFactory; 021 022import junit.framework.Test; 023import junit.framework.TestCase; 024import junit.framework.TestSuite; 025 026 027/** 028 * Factor tests with JUnit. 029 * @see edu.jas.application.FactorTest 030 * @author Heinz Kredel 031 */ 032 033public class FactorTest extends TestCase { 034 035 036 /** 037 * main. 038 */ 039 public static void main(String[] args) { 040 junit.textui.TestRunner.run(suite()); 041 } 042 043 044 /** 045 * Constructs a <CODE>FactorTest</CODE> object. 046 * @param name String. 047 */ 048 public FactorTest(String name) { 049 super(name); 050 } 051 052 053 /** 054 */ 055 public static Test suite() { 056 TestSuite suite = new TestSuite(FactorTest.class); 057 return suite; 058 } 059 060 061 int rl = 3; 062 063 064 int kl = 5; 065 066 067 int ll = 5; 068 069 070 int el = 3; 071 072 073 float q = 0.3f; 074 075 076 @Override 077 protected void setUp() { 078 } 079 080 081 @Override 082 protected void tearDown() { 083 ComputerThreads.terminate(); 084 } 085 086 087 /** 088 * Test dummy for Junit. 089 */ 090 public void testDummy() { 091 } 092 093 094 /** 095 * Test factory, typed implementation. 096 */ 097 public void testFactory() { 098 ModIntegerRing mi = new ModIntegerRing(19, true); 099 Factorization<ModInteger> ufdm = FactorFactory.getImplementation(mi); 100 //System.out.println("ufdm = " + ufdm); 101 assertTrue("ufd != Modular " + ufdm, ufdm instanceof FactorModular); 102 103 ModLongRing ml = new ModLongRing(19, true); 104 Factorization<ModLong> ufdml = FactorFactory.getImplementation(ml); 105 //System.out.println("ufdml = " + ufdml); 106 assertTrue("ufd != Modular " + ufdml, ufdml instanceof FactorModular); 107 108 BigInteger bi = new BigInteger(1); 109 Factorization<BigInteger> ufdi = FactorFactory.getImplementation(bi); 110 //System.out.println("ufdi = " + ufdi); 111 assertTrue("ufd != Integer " + ufdi, ufdi instanceof FactorInteger); 112 113 BigRational br = new BigRational(1); 114 Factorization<BigRational> ufdr = FactorFactory.getImplementation(br); 115 //System.out.println("ufdr = " + ufdr); 116 assertTrue("ufd != Rational " + ufdr, ufdr instanceof FactorRational); 117 118 GenPolynomialRing<ModInteger> pmfac = new GenPolynomialRing<ModInteger>(mi, 1); 119 GenPolynomial<ModInteger> pm = pmfac.univariate(0); 120 AlgebraicNumberRing<ModInteger> am = new AlgebraicNumberRing<ModInteger>(pm, true); 121 Factorization<AlgebraicNumber<ModInteger>> ufdam = FactorFactory.getImplementation(am); 122 //System.out.println("ufdam = " + ufdam); 123 //assertTrue("ufd != AlgebraicNumber<ModInteger> " + ufdam, ufdam instanceof FactorAlgebraic); 124 assertTrue("ufd != AlgebraicNumber<ModInteger> " + ufdam, ufdam instanceof FactorModularBerlekamp); 125 126 GenPolynomialRing<BigRational> prfac = new GenPolynomialRing<BigRational>(br, 1); 127 GenPolynomial<BigRational> pr = prfac.univariate(0); 128 AlgebraicNumberRing<BigRational> ar = new AlgebraicNumberRing<BigRational>(pr, true); 129 Factorization<AlgebraicNumber<BigRational>> ufdar = FactorFactory.getImplementation(ar); 130 //System.out.println("ufdar = " + ufdar); 131 assertTrue("ufd != AlgebraicNumber<BigRational> " + ufdar, ufdar instanceof FactorAlgebraic); 132 133 prfac = new GenPolynomialRing<BigRational>(br, 2); 134 QuotientRing<BigRational> qrfac = new QuotientRing<BigRational>(prfac); 135 Factorization<Quotient<BigRational>> ufdqr = FactorFactory.getImplementation(qrfac); 136 //System.out.println("ufdqr = " + ufdqr); 137 assertTrue("ufd != Quotient<BigRational> " + ufdqr, ufdqr instanceof FactorQuotient); 138 } 139 140 141 /** 142 * Test factory generic implementation. 143 */ 144 @SuppressWarnings("unchecked") 145 public void testFactoryGeneric() { 146 ModIntegerRing mi = new ModIntegerRing(19, true); 147 Factorization<ModInteger> ufdm = FactorFactory.getImplementation((RingFactory) mi); 148 //System.out.println("ufdm = " + ufdm); 149 assertTrue("ufd != Modular " + ufdm, ufdm instanceof FactorModular); 150 151 BigInteger bi = new BigInteger(1); 152 Factorization<BigInteger> ufdi = FactorFactory.getImplementation((RingFactory) bi); 153 //System.out.println("ufdi = " + ufdi); 154 assertTrue("ufd != Integer " + ufdi, ufdi instanceof FactorInteger); 155 156 BigRational br = new BigRational(1); 157 Factorization<BigRational> ufdr = FactorFactory.getImplementation((RingFactory) br); 158 //System.out.println("ufdr = " + ufdr); 159 assertTrue("ufd != Rational " + ufdr, ufdr instanceof FactorRational); 160 161 GenPolynomialRing<ModInteger> pmfac = new GenPolynomialRing<ModInteger>(mi, 1); 162 GenPolynomial<ModInteger> pm = pmfac.univariate(0); 163 AlgebraicNumberRing<ModInteger> am = new AlgebraicNumberRing<ModInteger>(pm, true); 164 Factorization<AlgebraicNumber<ModInteger>> ufdam = FactorFactory.getImplementation((RingFactory) am); 165 //System.out.println("ufdam = " + ufdam); 166 //assertTrue("ufd != AlgebraicNumber<ModInteger> " + ufdam, ufdam instanceof FactorAlgebraic); 167 assertTrue("ufd != AlgebraicNumber<ModInteger> " + ufdam, ufdam instanceof FactorModularBerlekamp); 168 169 GenPolynomialRing<BigRational> prfac = new GenPolynomialRing<BigRational>(br, 1); 170 GenPolynomial<BigRational> pr = prfac.univariate(0); 171 AlgebraicNumberRing<BigRational> ar = new AlgebraicNumberRing<BigRational>(pr, true); 172 Factorization<AlgebraicNumber<BigRational>> ufdar = FactorFactory.getImplementation((RingFactory) ar); 173 //System.out.println("ufdar = " + ufdar); 174 assertTrue("ufd != AlgebraicNumber<BigRational> " + ufdar, ufdar instanceof FactorAlgebraic); 175 176 prfac = new GenPolynomialRing<BigRational>(br, 2); 177 QuotientRing<BigRational> qrfac = new QuotientRing<BigRational>(prfac); 178 Factorization<Quotient<BigRational>> ufdqr = FactorFactory.getImplementation((RingFactory) qrfac); 179 //System.out.println("ufdqr = " + ufdqr); 180 assertTrue("ufd != Quotient<BigRational> " + ufdqr, ufdqr instanceof FactorQuotient); 181 182 pmfac = new GenPolynomialRing<ModInteger>(mi, 1); 183 QuotientRing<ModInteger> qmfac = new QuotientRing<ModInteger>(pmfac); 184 Factorization<Quotient<ModInteger>> ufdqm = FactorFactory.getImplementation((RingFactory) qmfac); 185 //System.out.println("ufdqm = " + ufdqm); 186 assertTrue("ufd != Quotient<ModInteger> " + ufdqm, ufdqm instanceof FactorQuotient); 187 188 prfac = new GenPolynomialRing<BigRational>(br, 2); 189 GenPolynomialRing<GenPolynomial<BigRational>> rrfac = new GenPolynomialRing<GenPolynomial<BigRational>>( 190 prfac, 1); 191 Factorization<BigRational> ufdrr = FactorFactory.getImplementation((RingFactory) rrfac); 192 //System.out.println("ufdrr = " + ufdrr); 193 assertTrue("ufd != GenPolynomial<GenPolynomialBigRational>> " + ufdrr, 194 ufdrr instanceof FactorRational); 195 } 196 197 198 /** 199 * Test factory specific implementation. 200 */ 201 public void testFactorySpecific() { 202 ModIntegerRing mi = new ModIntegerRing(19, true); 203 Factorization<ModInteger> ufdm = FactorFactory.getImplementation(mi); 204 //System.out.println("ufdm = " + ufdm); 205 assertTrue("ufd != Modular " + ufdm, ufdm instanceof FactorModular); 206 207 BigInteger bi = new BigInteger(1); 208 Factorization<BigInteger> ufdi = FactorFactory.getImplementation(bi); 209 //System.out.println("ufdi = " + ufdi); 210 assertTrue("ufd != Integer " + ufdi, ufdi instanceof FactorInteger); 211 212 BigRational br = new BigRational(1); 213 Factorization<BigRational> ufdr = FactorFactory.getImplementation(br); 214 //System.out.println("ufdr = " + ufdr); 215 assertTrue("ufd != Rational " + ufdr, ufdr instanceof FactorRational); 216 217 GenPolynomialRing<ModInteger> pmfac = new GenPolynomialRing<ModInteger>(mi, 1); 218 GenPolynomial<ModInteger> pm = pmfac.univariate(0); 219 AlgebraicNumberRing<ModInteger> am = new AlgebraicNumberRing<ModInteger>(pm, true); 220 Factorization<AlgebraicNumber<ModInteger>> ufdam = FactorFactory.<ModInteger> getImplementation(am); 221 //System.out.println("ufdam = " + ufdam); 222 //assertTrue("ufd != AlgebraicNumber<ModInteger> " + ufdam, ufdam instanceof FactorAlgebraic); 223 assertTrue("ufd != AlgebraicNumber<ModInteger> " + ufdam, ufdam instanceof FactorModularBerlekamp); 224 225 GenPolynomialRing<BigRational> prfac = new GenPolynomialRing<BigRational>(br, 1); 226 GenPolynomial<BigRational> pr = prfac.univariate(0); 227 AlgebraicNumberRing<BigRational> ar = new AlgebraicNumberRing<BigRational>(pr, true); 228 Factorization<AlgebraicNumber<BigRational>> ufdar = FactorFactory.<BigRational> getImplementation(ar); 229 //System.out.println("ufdar = " + ufdar); 230 assertTrue("ufd != AlgebraicNumber<BigRational> " + ufdar, ufdar instanceof FactorAlgebraic); 231 232 prfac = new GenPolynomialRing<BigRational>(br, 2); 233 QuotientRing<BigRational> qrfac = new QuotientRing<BigRational>(prfac); 234 Factorization<Quotient<BigRational>> ufdqr = FactorFactory.<BigRational> getImplementation(qrfac); 235 //System.out.println("ufdqr = " + ufdqr); 236 assertTrue("ufd != Quotient<BigRational> " + ufdqr, ufdqr instanceof FactorQuotient); 237 238 pmfac = new GenPolynomialRing<ModInteger>(mi, 1); 239 QuotientRing<ModInteger> qmfac = new QuotientRing<ModInteger>(pmfac); 240 Factorization<Quotient<ModInteger>> ufdqm = FactorFactory.<ModInteger> getImplementation(qmfac); 241 //System.out.println("ufdqm = " + ufdqm); 242 assertTrue("ufd != Quotient<ModInteger> " + ufdqm, ufdqm instanceof FactorQuotient); 243 244 prfac = new GenPolynomialRing<BigRational>(br, 2); 245 //GenPolynomialRing<GenPolynomial<BigRational>> rrfac = new GenPolynomialRing<GenPolynomial<BigRational>>( 246 // prfac, 1); 247 Factorization<BigRational> ufdrr = FactorFactory.<BigRational> getImplementation(prfac); 248 //System.out.println("ufdrr = " + ufdrr); 249 assertTrue("ufd != GenPolynomial<GenPolynomialBigRational>> " + ufdrr, 250 ufdrr instanceof FactorRational); 251 } 252 253 254 /** 255 * Test rational absolute factorization, for elementary integration. 256 */ 257 public void testBaseRationalAbsoluteFactorization() { 258 TermOrder to = new TermOrder(TermOrder.INVLEX); 259 BigRational cfac = new BigRational(1); 260 //String[] alpha = new String[] { "alpha" }; 261 String[] vars = new String[] { "x" }; 262 GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, 1, to, vars); 263 GenPolynomial<BigRational> agen = pfac.univariate(0, 4); 264 agen = agen.sum(pfac.fromInteger(4)); // x^4 + 4 265 266 // GenPolynomial<BigRational> x6 = pfac.univariate(0, 6); 267 // GenPolynomial<BigRational> x4 = pfac.univariate(0, 4); 268 // GenPolynomial<BigRational> x2 = pfac.univariate(0, 2); 269 // // x^6 - 5 x^4 + 5 x^2 + 4 270 // agen = x6.subtract(x4.multiply(pfac.fromInteger(5))); 271 // agen = agen.sum(x2.multiply(pfac.fromInteger(5))); 272 // agen = agen.sum(pfac.fromInteger(4)); 273 274 // GenPolynomial<BigRational> x3 = pfac.univariate(0, 3); 275 // GenPolynomial<BigRational> x = pfac.univariate(0); 276 // // x^3 + x 277 // agen = x3.sum(x); 278 279 // GenPolynomial<BigRational> x2 = pfac.univariate(0, 2); 280 // // x^2 - 2 281 // agen = x2.subtract(pfac.fromInteger(2)); 282 283 GenPolynomial<BigRational> N = pfac.getONE(); 284 FactorRational engine = new FactorRational(); 285 PartialFraction<BigRational> F = engine.baseAlgebraicPartialFraction(N, agen); 286 //System.out.println("\npartial fraction: " + F.toScript()); 287 assertTrue("is partial fraction: " + F, F.isPartialFraction()); 288 } 289 290}