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