001 /*
002 * $Id: ExtensionFieldBuilderTest.java 3591 2011-04-01 20:29:49Z kredel $
003 */
004
005 package edu.jas.application;
006
007
008 import java.util.List;
009
010 import junit.framework.Test;
011 import junit.framework.TestCase;
012 import junit.framework.TestSuite;
013
014 import org.apache.log4j.BasicConfigurator;
015
016 import edu.jas.arith.BigRational;
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.ComplexRing;
022 import edu.jas.poly.GenPolynomial;
023 import edu.jas.poly.GenPolynomialRing;
024 import edu.jas.root.RealAlgebraicNumber;
025 import edu.jas.root.RootFactory;
026 import edu.jas.structure.Power;
027 import edu.jas.structure.RingElem;
028 import edu.jas.structure.RingFactory;
029 import edu.jas.ufd.Quotient;
030 import edu.jas.ufd.QuotientRing;
031
032
033 /**
034 * ExtensionFieldBuilder tests with JUnit.
035 * @author Heinz Kredel.
036 */
037
038 public class ExtensionFieldBuilderTest extends TestCase {
039
040
041 /**
042 * main.
043 */
044 public static void main(String[] args) {
045 BasicConfigurator.configure();
046 junit.textui.TestRunner.run(suite());
047 }
048
049
050 /**
051 * Constructs a <CODE>ExtensionFieldBuilderTest</CODE> object.
052 * @param name String.
053 */
054 public ExtensionFieldBuilderTest(String name) {
055 super(name);
056 }
057
058
059 /**
060 * suite.
061 */
062 public static Test suite() {
063 TestSuite suite = new TestSuite(ExtensionFieldBuilderTest.class);
064 return suite;
065 }
066
067
068 ExtensionFieldBuilder builder;
069
070
071 @Override
072 protected void setUp() {
073 builder = null;
074 }
075
076
077 @Override
078 protected void tearDown() {
079 builder = null;
080 ComputerThreads.terminate();
081 }
082
083
084 /**
085 * Test construction Q(sqrt(2))(x)(sqrt(x)) by hand.
086 */
087 public void testConstructionF0() {
088 BigRational bf = new BigRational(1);
089 GenPolynomialRing<BigRational> pf = new GenPolynomialRing<BigRational>(bf, new String[] { "w2" });
090 GenPolynomial<BigRational> a = pf.parse("w2^2 - 2");
091 AlgebraicNumberRing<BigRational> af = new AlgebraicNumberRing<BigRational>(a);
092 GenPolynomialRing<AlgebraicNumber<BigRational>> tf = new GenPolynomialRing<AlgebraicNumber<BigRational>>(
093 af, new String[] { "x" });
094 QuotientRing<AlgebraicNumber<BigRational>> qf = new QuotientRing<AlgebraicNumber<BigRational>>(tf);
095 GenPolynomialRing<Quotient<AlgebraicNumber<BigRational>>> qaf = new GenPolynomialRing<Quotient<AlgebraicNumber<BigRational>>>(
096 qf, new String[] { "wx" });
097 GenPolynomial<Quotient<AlgebraicNumber<BigRational>>> b = qaf.parse("wx^2 - x");
098 AlgebraicNumberRing<Quotient<AlgebraicNumber<BigRational>>> fac = new AlgebraicNumberRing<Quotient<AlgebraicNumber<BigRational>>>(
099 b);
100 //System.out.println("fac = " + fac.toScript());
101
102 List<AlgebraicNumber<Quotient<AlgebraicNumber<BigRational>>>> gens = fac.generators();
103 int s = gens.size();
104 //System.out.println("gens = " + gens);
105 assertTrue("#gens == 4 " + s, s == 4);
106
107 AlgebraicNumber<Quotient<AlgebraicNumber<BigRational>>> elem = fac.random(2);
108 if (elem.isZERO() || elem.isONE()) {
109 elem = gens.get(s - 1).sum(gens.get(s - 2));
110 //elem = (RingElem)gens.get(s-1).multiply(gens.get(s-2));
111 elem = elem.multiply(elem);
112 }
113 //System.out.println("elem = " + elem.toScript());
114 //System.out.println("elem = " + elem);
115
116 AlgebraicNumber<Quotient<AlgebraicNumber<BigRational>>> inv = elem.inverse();
117 //System.out.println("inv = " + inv.toScript());
118 //System.out.println("inv = " + inv);
119
120 AlgebraicNumber<Quotient<AlgebraicNumber<BigRational>>> e = elem.multiply(inv);
121 assertTrue("e / e == 1 " + e, e.isONE());
122 }
123
124
125 /**
126 * Test construction Q(sqrt(2))(x)(sqrt(x)) by extension field builder.
127 */
128 public void testConstructionF1() {
129 builder = ExtensionFieldBuilder.baseField(new BigRational(1));
130 //System.out.println("builder = " + builder.toString());
131
132 RingFactory fac = builder.build();
133 //System.out.println("fac = " + fac.toScript());
134
135 builder = builder.algebraicExtension("w2", "w2^2 - 2");
136 //System.out.println("builder = " + builder.toString());
137
138 fac = builder.build();
139 //System.out.println("fac = " + fac.toScript());
140
141 builder = builder.transcendentExtension("x");
142 //System.out.println("builder = " + builder.toString());
143
144 fac = builder.build();
145 //System.out.println("fac = " + fac.toScript());
146
147 builder = builder.algebraicExtension("wx", "wx^2 - x"); // number of { } resolved
148 //System.out.println("builder = " + builder.toString());
149
150 fac = builder.build();
151 //System.out.println("fac = " + fac.toScript());
152
153 List<RingElem> gens = fac.generators();
154 int s = gens.size();
155 //System.out.println("gens = " + gens);
156 assertTrue("#gens == 4 " + s, s == 4);
157
158 RingElem elem = (RingElem) fac.random(2);
159 if (elem.isZERO() || elem.isONE()) {
160 elem = (RingElem) gens.get(s - 1).sum(gens.get(s - 2));
161 //elem = (RingElem)gens.get(s-1).multiply(gens.get(s-2));
162 elem = (RingElem) elem.multiply(elem);
163 }
164 //System.out.println("elem = " + elem.toScript());
165 //System.out.println("elem = " + elem);
166
167 RingElem inv = (RingElem) elem.inverse();
168 //System.out.println("inv = " + inv.toScript());
169 //System.out.println("inv = " + inv);
170
171 RingElem a = (RingElem) elem.multiply(inv);
172 assertTrue("e / e == 1 " + a, a.isONE());
173 }
174
175
176 /**
177 * Test construction Q(x)(sqrt(2))(sqrt(x)) by extension field builder.
178 */
179 public void testConstructionF2() {
180 builder = ExtensionFieldBuilder.baseField(new BigRational(1));
181 //System.out.println("builder = " + builder.toString());
182
183 RingFactory fac = builder.build();
184 //System.out.println("fac = " + fac.toScript());
185
186 builder = builder.transcendentExtension("x");
187 //System.out.println("builder = " + builder.toString());
188
189 fac = builder.build();
190 //System.out.println("fac = " + fac.toScript());
191 builder = builder.algebraicExtension("w2", "w2^2 - 2");
192 //System.out.println("builder = " + builder.toString());
193
194 fac = builder.build();
195 //System.out.println("fac = " + fac.toScript());
196
197 builder = builder.algebraicExtension("wx", "wx^2 - x"); // number of { } resolved
198 //System.out.println("builder = " + builder.toString());
199
200 fac = builder.build();
201 //System.out.println("fac = " + fac.toScript());
202
203 List<RingElem> gens = fac.generators();
204 int s = gens.size();
205 //System.out.println("gens = " + gens);
206 assertTrue("#gens == 4 " + s, s == 4);
207
208 RingElem elem = (RingElem) fac.random(1);
209 if (elem.isZERO() || elem.isONE()) {
210 elem = (RingElem) gens.get(s - 1).sum(gens.get(s - 2));
211 //elem = (RingElem)gens.get(s-1).multiply(gens.get(s-2));
212 elem = (RingElem) elem.multiply(elem);
213 }
214 //System.out.println("elem = " + elem.toScript());
215 //System.out.println("elem = " + elem);
216
217 RingElem inv = (RingElem) elem.inverse();
218 //System.out.println("inv = " + inv.toScript());
219 //System.out.println("inv = " + inv);
220
221 RingElem a = (RingElem) elem.multiply(inv);
222 assertTrue("e / e == 1 " + a, a.isONE());
223 }
224
225
226 /**
227 * Test construction Z_p(sqrt(2))(x)(sqrt(x)) by extension field builder.
228 */
229 public void testConstructionF3() {
230 RingFactory fac = ExtensionFieldBuilder.baseField(new ModLongRing(7))
231 .algebraicExtension("w2", "w2^2 - 3").transcendentExtension("x")
232 .algebraicExtension("wx", "wx^7 - x").build();
233 //System.out.println("fac = " + fac.toScript());
234
235 List<RingElem> gens = fac.generators();
236 int s = gens.size();
237 //System.out.println("gens = " + gens);
238 assertTrue("#gens == 4 " + s, s == 4);
239
240 RingElem elem = (RingElem) fac.random(2);
241 if (elem.isZERO() || elem.isONE()) {
242 elem = (RingElem) gens.get(s - 1).sum(gens.get(s - 2));
243 //elem = (RingElem)gens.get(s-1).multiply(gens.get(s-2));
244 elem = (RingElem) elem.multiply(elem);
245 }
246 //System.out.println("elem = " + elem.toScript());
247 //System.out.println("elem = " + elem);
248
249 RingElem inv = (RingElem) elem.inverse();
250 //System.out.println("inv = " + inv.toScript());
251 //System.out.println("inv = " + inv);
252
253 RingElem a = (RingElem) elem.multiply(inv);
254 assertTrue("e / e == 1 " + a, a.isONE());
255 }
256
257
258 /**
259 * Test construction Q(+3rt(3))(+sqrt(+3rt(3)))(+5rt(2)) by extension field
260 * builder.
261 */
262 public void testConstructionR1() {
263 RingFactory fac = ExtensionFieldBuilder.baseField(new BigRational(1))
264 .realAlgebraicExtension("q", "q^3 - 3", "[1,2]")
265 .realAlgebraicExtension("w", "w^2 - q", "[1,2]")
266 .realAlgebraicExtension("s", "s^5 - 2", "[1,2]").build();
267 //System.out.println("fac = " + fac.toScript());
268
269 List<RingElem> gens = fac.generators();
270 int s = gens.size();
271 //System.out.println("gens = " + gens);
272 assertTrue("#gens == 4 " + s, s == 4);
273
274 RingElem elem = (RingElem) fac.random(2);
275 if (elem.isZERO() || elem.isONE()) {
276 elem = (RingElem) gens.get(s - 1).sum(gens.get(s - 2));
277 //elem = (RingElem)gens.get(s-1).multiply(gens.get(s-2));
278 elem = (RingElem) elem.multiply(elem);
279 }
280 //elem = (RingElem)elem.negate();
281 //System.out.println("elem = " + elem.toScript());
282 //System.out.println("elem = " + elem);
283 //BigDecimal ed = new BigDecimal(((Rational)elem).getRational());
284 //System.out.println(" ~ " + ed);
285
286 RingElem inv = (RingElem) elem.inverse();
287 //System.out.println("inv = " + inv.toScript());
288 //System.out.println("inv = " + inv);
289 //BigDecimal id = new BigDecimal(((Rational)inv).getRational());
290 //System.out.println(" ~ " + id);
291
292 RingElem a = (RingElem) elem.multiply(inv);
293 //System.out.println("a = " + a);
294 //System.out.println(" ~ " + ed.multiply(id));
295 assertTrue("e / e == 1 " + a, a.isONE());
296 }
297
298
299 /**
300 * Test construction Q(sqrt(-1))(+3rt(i)) by extension field builder.
301 */
302 public void testConstructionC1() {
303 ComplexRing<BigRational> cf = new ComplexRing<BigRational>(new BigRational(1));
304 //System.out.println("cf = " + cf.toScript());
305 RingFactory fac = ExtensionFieldBuilder.baseField(cf)
306 .complexAlgebraicExtension("w2", "w2^2 + 2", "[-1i0,1i2]")
307 //.complexAlgebraicExtension("q3", "q3^3 + { w2 }","[-1i0,1i2]") // not possible, TODO
308 .build();
309 //System.out.println("fac = " + fac.toScript());
310
311 List<RingElem> gens = fac.generators();
312 int s = gens.size();
313 //System.out.println("gens = " + gens);
314 assertTrue("#gens == 3 " + s, s == 3);
315
316 RingElem elem = (RingElem) fac.random(2);
317 if (elem.isZERO() || elem.isONE()) {
318 elem = (RingElem) gens.get(s - 1).sum(gens.get(s - 2));
319 //elem = (RingElem)gens.get(s-1).multiply(gens.get(s-2));
320 elem = (RingElem) elem.multiply(elem);
321 }
322 //System.out.println("elem = " + elem.toScript());
323 //System.out.println("elem = " + elem);
324
325 RingElem inv = (RingElem) elem.inverse();
326 //System.out.println("inv = " + inv.toScript());
327 //System.out.println("inv = " + inv);
328
329 RingElem a = (RingElem) elem.multiply(inv);
330 //System.out.println("a = " + a);
331 assertTrue("e / e == 1 " + a, a.isONE());
332 }
333
334
335 /**
336 * Test construction Q(+3rt(3))(+sqrt(+3rt(3)))(+5rt(2))[y] by extension
337 * field builder and real root calculation.
338 */
339 public void testConstructionR2factory() {
340 RingFactory fac = ExtensionFieldBuilder.baseField(new BigRational(1))
341 .realAlgebraicExtension("q", "q^3 - 3", "[1,2]")
342 .realAlgebraicExtension("w", "w^2 - q", "[1,2]")
343 .realAlgebraicExtension("s", "s^5 - 2", "[1,2]").build();
344 //System.out.println("fac = " + fac.toScript());
345
346 List<RingElem> gens = fac.generators();
347 int s = gens.size();
348 //System.out.println("gens = " + gens);
349 assertTrue("#gens == 4 " + s, s == 4);
350
351 GenPolynomialRing pfac = new GenPolynomialRing(fac, new String[] { "y" });
352 GenPolynomial elem = pfac.parse("y^2 - w s");
353 //elem = (RingElem)elem.negate();
354 //System.out.println("elem = " + elem.toScript());
355 //System.out.println("elem = " + elem);
356
357 List<RealAlgebraicNumber<BigRational>> roots = RootFactory
358 .realAlgebraicNumbers((GenPolynomial<BigRational>) elem);
359 //System.out.println("roots = " + roots);
360 assertTrue("#roots == 2 " + roots, roots.size() == 2);
361 for (RealAlgebraicNumber root : roots) {
362 //BigDecimal id = new BigDecimal(root.getRational());
363 //System.out.println("root = " + root);
364 //System.out.println(" ~ " + id);
365 RealAlgebraicNumber inv = root.inverse();
366 //System.out.println("inv = " + inv);
367 //BigDecimal ivd = new BigDecimal(inv.getRational());
368 //System.out.println(" ~ " + ivd);
369
370 RealAlgebraicNumber a = root.multiply(inv);
371 //System.out.println("a = " + a);
372 //System.out.println(" ~ " + id.multiply(ivd));
373 assertTrue("y / y == 1 " + a, a.isONE());
374 }
375 }
376
377
378 /**
379 * Test construction by extension field builder and multiple algebraic
380 * extension.
381 */
382 public void testConstructionM1() {
383 RingFactory fac = ExtensionFieldBuilder.baseField(new BigRational(1))
384 .algebraicExtension("q,w,s", "( q^3 - 3, w^2 - q, s^5 - 2)").build();
385 //System.out.println("fac = " + fac.toScript());
386
387 List<RingElem> gens = fac.generators();
388 int s = gens.size();
389 //System.out.println("gens = " + gens);
390 assertTrue("#gens == 4 " + s, s == 4);
391
392 GenPolynomialRing pfac = (GenPolynomialRing) ExtensionFieldBuilder.baseField(fac)
393 .polynomialExtension("y").build();
394 GenPolynomial elem = pfac.parse("y^2 - w s");
395 //System.out.println("elem = " + elem.toScript());
396 //System.out.println("elem = " + elem);
397
398 RingElem r = (RingElem) elem.trailingBaseCoefficient();
399 RingElem t = (RingElem) r.inverse();
400 RingElem u = (RingElem) r.multiply(t);
401 //System.out.println("r = " + r);
402 //System.out.println("t = " + t);
403 //System.out.println("r*t = " + u);
404 assertTrue("r*t == 1: ", u.isONE());
405
406 elem = elem.multiply(elem.negate());
407 //System.out.println("elem = " + elem);
408 elem = Power.positivePower(elem, 3);
409 //System.out.println("elem = " + elem);
410 }
411
412
413 /**
414 * Test construction by extension field builder and multiple transcendent
415 * extension.
416 */
417 public void testConstructionM2() {
418 RingFactory fac = ExtensionFieldBuilder.baseField(new BigRational(1)).algebraicExtension("q,w,s", "")
419 .build();
420 //System.out.println("fac = " + fac.toScript());
421
422 List<RingElem> gens = fac.generators();
423 int s = gens.size();
424 //System.out.println("gens = " + gens);
425 assertTrue("#gens == 4 " + s, s == 4);
426
427 GenPolynomialRing pfac = (GenPolynomialRing) ExtensionFieldBuilder.baseField(fac)
428 .polynomialExtension("y").build();
429 GenPolynomial elem = pfac.parse("y^2 - w s");
430 //System.out.println("elem = " + elem.toScript());
431 //System.out.println("elem = " + elem);
432
433 RingElem r = (RingElem) elem.trailingBaseCoefficient();
434 RingElem t = (RingElem) r.inverse();
435 RingElem u = (RingElem) r.multiply(t);
436 //System.out.println("r = " + r);
437 //System.out.println("t = " + t);
438 //System.out.println("r*t = " + u);
439 assertTrue("r*t == 1: ", u.isONE());
440
441 elem = elem.multiply(elem.negate());
442 //System.out.println("elem = " + elem);
443 elem = Power.positivePower(elem, 3);
444 //System.out.println("elem = " + elem);
445 }
446
447 }