001/*
002 * $Id: QuotSolvablePolynomialTest.java 5691 2017-01-08 18:43:48Z kredel $
003 */
004
005package edu.jas.fd;
006
007
008import java.util.List;
009
010import org.apache.log4j.BasicConfigurator;
011
012import edu.jas.arith.BigRational;
013import edu.jas.poly.ExpVector;
014import edu.jas.poly.GenPolynomial;
015import edu.jas.poly.GenSolvablePolynomial;
016import edu.jas.poly.GenSolvablePolynomialRing;
017import edu.jas.poly.RecSolvablePolynomial;
018import edu.jas.poly.RelationGenerator;
019import edu.jas.poly.TermOrder;
020import edu.jas.poly.WeylRelations;
021import edu.jas.kern.ComputerThreads;
022
023import junit.framework.Test;
024import junit.framework.TestCase;
025import junit.framework.TestSuite;
026
027
028/**
029 * BigRational coefficients QuotSolvablePolynomial tests with JUnit.
030 * @author Heinz Kredel
031 */
032
033public class QuotSolvablePolynomialTest 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        ComputerThreads.terminate();
043    }
044
045
046    /**
047     * Constructs a <CODE>QuotSolvablePolynomialTest</CODE> object.
048     * @param name String.
049     */
050    public QuotSolvablePolynomialTest(String name) {
051        super(name);
052    }
053
054
055    /**
056     */
057    public static Test suite() {
058        TestSuite suite = new TestSuite(QuotSolvablePolynomialTest.class);
059        return suite;
060    }
061
062
063    QuotSolvablePolynomial<BigRational> a, b, c, d, e, f, x1, x2;
064
065
066    int rl = 4;
067
068
069    int kl = 1;
070
071
072    int ll = 4;
073
074
075    int el = 3;
076
077
078    float q = 0.2f;
079
080
081    String[] cvars = new String[] { "a", "b" };
082
083
084    String[] vars = new String[] { "w", "x", "y", "z" };
085
086
087    QuotSolvablePolynomialRing<BigRational> ring;
088
089
090    BigRational cfac;
091
092
093    GenSolvablePolynomialRing<SolvableQuotient<BigRational>> sring;
094
095
096    GenSolvablePolynomialRing<BigRational> cring;
097
098
099    SolvableQuotientRing<BigRational> qcring;
100
101
102    TermOrder tord = new TermOrder(TermOrder.INVLEX);
103
104
105    @Override
106    protected void setUp() {
107        cfac = new BigRational(1);
108        cring = new GenSolvablePolynomialRing<BigRational>(cfac, tord, cvars);
109        qcring = new SolvableQuotientRing<BigRational>(cring);
110        ring = new QuotSolvablePolynomialRing<BigRational>(qcring, tord, vars);
111        RelationGenerator<SolvableQuotient<BigRational>> wl = new WeylRelations<SolvableQuotient<BigRational>>();
112        ring.addRelations(wl); //wl.generate(ring);
113        a = b = c = d = e = null;
114    }
115
116
117    @Override
118    protected void tearDown() {
119        ring = null;
120        a = b = c = d = e = null;
121    }
122
123
124    /**
125     * Test constructor, generators and properties.
126     */
127    public void testConstructor() {
128        assertFalse("not commutative", ring.isCommutative());
129        assertTrue("associative", ring.isAssociative());
130
131        a = new QuotSolvablePolynomial<BigRational>(ring);
132        assertTrue("length( a ) = 0", a.length() == 0);
133        assertTrue("isZERO( a )", a.isZERO());
134        assertTrue("isONE( a )", !a.isONE());
135
136        c = ring.getONE();
137        assertTrue("length( c ) = 1", c.length() == 1);
138        assertTrue("isZERO( c )", !c.isZERO());
139        assertTrue("isONE( c )", c.isONE());
140
141        d = ring.getZERO();
142        assertTrue("length( d ) = 0", d.length() == 0);
143        assertTrue("isZERO( d )", d.isZERO());
144        assertTrue("isONE( d )", !d.isONE());
145        //System.out.println("d = " + d);
146
147        //System.out.println("");
148        for (GenPolynomial<SolvableQuotient<BigRational>> g : ring.generators()) {
149            //System.out.print("g = " + g + ", ");
150            assertFalse("not isZERO( g )", g.isZERO());
151        }
152        //System.out.println("");
153        assertTrue("isAssociative: ", ring.isAssociative());
154    }
155
156
157    /**
158     * Test random polynomial.
159     */
160    public void testRandom() {
161        for (int i = 0; i < 3; i++) {
162            // a = ring.random(ll+2*i);
163            a = ring.random(kl * (i + 1), ll + 2 * i, el + i, q);
164            //System.out.println("a = " + a);
165            assertTrue("length( a" + i + " ) <> 0", a.length() >= 0);
166            assertTrue(" not isZERO( a" + i + " )", !a.isZERO());
167            assertTrue(" not isONE( a" + i + " )", !a.isONE());
168        }
169    }
170
171
172    /**
173     * Test addition.
174     */
175    public void testAddition() {
176        a = ring.random(kl, ll, el, q);
177        c = (QuotSolvablePolynomial<BigRational>) a.subtract(a);
178        assertTrue("a-a = 0", c.isZERO());
179
180        b = (QuotSolvablePolynomial<BigRational>) a.sum(a);
181        c = (QuotSolvablePolynomial<BigRational>) b.subtract(a);
182        assertEquals("a+a-a = a", c, a);
183
184        b = ring.random(kl, ll, el, q);
185        c = (QuotSolvablePolynomial<BigRational>) b.sum(a);
186        d = (QuotSolvablePolynomial<BigRational>) a.sum(b);
187        assertEquals("a+b = b+a", c, d);
188
189        c = ring.random(kl, ll, el, q);
190        d = (QuotSolvablePolynomial<BigRational>) a.sum(b.sum(c));
191        e = (QuotSolvablePolynomial<BigRational>) a.sum(b).sum(c);
192        assertEquals("a+(b+c) = (a+b)+c", d, e);
193        //System.out.println("a = " + a);
194        //System.out.println("b = " + b);
195        //System.out.println("c = " + c);
196        //System.out.println("d = " + d);
197        //System.out.println("e = " + e);
198
199        ExpVector u = ExpVector.EVRAND(rl, el, q);
200        SolvableQuotient<BigRational> x = qcring.random(kl);
201        //System.out.println("x = " + x);
202        //System.out.println("u = " + u);
203
204        b = ring.getONE().multiply(x, u);
205        c = (QuotSolvablePolynomial<BigRational>) a.sum(b);
206        d = (QuotSolvablePolynomial<BigRational>) a.sum(x, u);
207        //System.out.println("a = " + a);
208        //System.out.println("b = " + b);
209        //System.out.println("c = " + c);
210        //System.out.println("d = " + d);
211        assertEquals("a+p(x,u) = a+(x,u)", c, d);
212
213        c = (QuotSolvablePolynomial<BigRational>) a.subtract(b);
214        d = (QuotSolvablePolynomial<BigRational>) a.subtract(x, u);
215        assertEquals("a-p(x,u) = a-(x,u)", c, d);
216
217        a = ring.getZERO();
218        b = ring.getONE().multiply(x, u);
219        c = (QuotSolvablePolynomial<BigRational>) b.sum(a);
220        d = (QuotSolvablePolynomial<BigRational>) a.sum(x, u);
221        assertEquals("a+p(x,u) = a+(x,u)", c, d);
222
223        c = (QuotSolvablePolynomial<BigRational>) a.subtract(b);
224        d = (QuotSolvablePolynomial<BigRational>) a.subtract(x, u);
225        assertEquals("a-p(x,u) = a-(x,u)", c, d);
226    }
227
228
229    /**
230     * Test multiplication.
231     */
232    public void testMultiplication() {
233        //System.out.println("ring = " + ring);
234        a = ring.random(kl, ll - 1, el - 1, q);
235        //a = ring.parse(" b y z + a w z ");  
236        b = ring.random(kl, ll - 1, el - 1, q);
237        //b = ring.parse(" w x - b x "); 
238
239        c = b.multiply(a);
240        d = a.multiply(b);
241        //System.out.println("a = " + a);
242        //System.out.println("b = " + b);
243        //System.out.println("c = " + c);
244        //System.out.println("d = " + d);
245        assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector()));
246
247        c = ring.random(kl, ll - 1, el - 1, q);
248        d = a.multiply(b.multiply(c));
249        e = a.multiply(b).multiply(c);
250        assertEquals("a(bc) = (ab)c", d, e);
251        //System.out.println("a = " + a);
252        //System.out.println("b = " + b);
253        //System.out.println("c = " + c);
254        //System.out.println("d = " + d);
255        //System.out.println("e = " + e);
256
257        SolvableQuotient<BigRational> xp = a.leadingBaseCoefficient().inverse();
258        d = a.multiply(xp);
259        assertTrue("monic(a) = a*(1/ldcf(ldcf(a)))", d.leadingBaseCoefficient().isONE());
260
261        d = (QuotSolvablePolynomial<BigRational>) a.monic();
262        assertTrue("a.monic(): ", d.leadingBaseCoefficient().isONE());
263    }
264
265
266    /**
267     * Test commutative ring.
268     */
269    public void testCommutative() {
270        //System.out.println("table = " + table.toString(vars));
271        //System.out.println("table = " + table.toScript());
272        //System.out.println("ring = " + ring);
273        //System.out.println("ring.table = " + ring.table.toScript());
274        //assertEquals("table == ring.table: ", table, ring.table); // ?
275        assertTrue("# relations == 2", ring.table.size() == 2);
276
277        ring = new QuotSolvablePolynomialRing<BigRational>(qcring, ring);
278        //System.out.println("ring = " + ring);
279
280        assertTrue("isCommutative()", ring.isCommutative());
281        assertTrue("isAssociative()", ring.isAssociative());
282
283        a = ring.random(kl, ll, el, q);
284        //a = ring.parse(" b x y z + a w z ");
285        //System.out.println("a = " + a);
286        b = ring.random(kl, ll, el, q);
287        //b = ring.parse(" w y z - b x ");
288        //System.out.println("b = " + b);
289
290        // commutative
291        c = b.multiply(a);
292        //System.out.println("c = " + c);
293        d = a.multiply(b);
294        //d = ring.getONE(); 
295        //System.out.println("d = " + d);
296        assertEquals("b*a == a*b: ", c, d);
297    }
298
299
300    /**
301     * Test distributive law.
302     */
303    public void testDistributive() {
304        a = ring.random(kl, ll, el, q);
305        b = ring.random(kl, ll, el, q);
306        c = ring.random(kl, ll, el, q);
307
308        d = a.multiply((QuotSolvablePolynomial<BigRational>) b.sum(c));
309        e = (QuotSolvablePolynomial<BigRational>) a.multiply(b).sum(a.multiply(c));
310        assertEquals("a*(b+c) = a*b+a*c", d, e);
311    }
312
313
314    /**
315     * Test solvable coefficient ring.
316     */
317    public void testSolvableCoeffs() {
318        GenSolvablePolynomialRing<BigRational> csring = new GenSolvablePolynomialRing<BigRational>(cfac, tord,
319                        cvars);
320        //RelationGenerator<BigRational> wlc = new WeylRelations<BigRational>(csring); 
321        //no: wlc.generate(csring);
322        //assertTrue("# relations == 1", csring.table.size() == 1);
323        assertTrue("isCommutative()", csring.isCommutative());
324        assertTrue("isAssociative()", csring.isAssociative());
325
326        SolvableQuotientRing<BigRational> qcsring = new SolvableQuotientRing<BigRational>(csring);
327        //assertFalse("isCommutative()", qcsring.isCommutative());
328        assertTrue("isAssociative()", qcsring.isAssociative());
329
330        ring = new QuotSolvablePolynomialRing<BigRational>(qcsring, ring);
331        RelationGenerator<SolvableQuotient<BigRational>> wl = new WeylRelations<SolvableQuotient<BigRational>>();
332        wl.generate(ring);
333        assertTrue("# relations == 2", ring.table.size() == 2);
334        assertFalse("isCommutative()", ring.isCommutative());
335        assertTrue("isAssociative()", ring.isAssociative());
336        //System.out.println("ring = " + ring);
337
338        RecSolvablePolynomial<BigRational> r1 = ring.polCoeff.parse("x");
339        GenSolvablePolynomial<BigRational> r2 = csring.parse("b");
340        RecSolvablePolynomial<BigRational> rp = ring.polCoeff.parse("b x + a"); // + a
341        //System.out.println("r1 = " + r1);
342        //System.out.println("r2 = " + r2);
343        //System.out.println("rp = " + rp);
344        ring.polCoeff.coeffTable.update(r1.leadingExpVector(), r2.leadingExpVector(), rp);
345        //System.out.println("ring.polCoeff = " + ring.polCoeff);
346
347        assertFalse("isCommutative()", ring.isCommutative());
348        assertTrue("isAssociative()", ring.isAssociative());
349
350        List<GenPolynomial<SolvableQuotient<BigRational>>> gens = ring.generators();
351        //gens = new ArrayList<GenPolynomial<SolvableQuotient<BigRational>>>();
352
353        for (GenPolynomial<SolvableQuotient<BigRational>> x : gens) {
354            GenSolvablePolynomial<SolvableQuotient<BigRational>> xx = (GenSolvablePolynomial<SolvableQuotient<BigRational>>) x;
355            a = new QuotSolvablePolynomial<BigRational>(ring, xx);
356            //System.out.println("a = " + a);
357            for (GenPolynomial<SolvableQuotient<BigRational>> y : gens) {
358                GenSolvablePolynomial<SolvableQuotient<BigRational>> yy = (GenSolvablePolynomial<SolvableQuotient<BigRational>>) y;
359                b = new QuotSolvablePolynomial<BigRational>(ring, yy);
360                //System.out.println("b = " + b);
361                c = a.multiply(b);
362                //System.out.println("gens: " + a + " * " + b + " = " + c);
363                ExpVector ev = a.leadingExpVector().sum(b.leadingExpVector());
364                assertTrue("LT(a)*LT(b) == LT(c)", c.leadingExpVector().equals(ev));
365            }
366        }
367
368        //a = ring.random(kl, ll, el, q);
369        //a = ring.getONE();
370        a = ring.parse("x^2 + a b");
371        //System.out.println("a = " + a.toScript());
372        //b = ring.random(kl, ll, el, q);
373        //b = ring.getONE();
374        b = ring.parse("a b^2 + a"); // + a 
375        b = (QuotSolvablePolynomial<BigRational>) b.inverse();
376        //System.out.println("b = " + b.toScript());
377
378        // non-commutative
379        c = b.multiply(a);
380        d = a.multiply(b);
381        //System.out.println("a = " + a.toScript());
382        //System.out.println("b = " + b.toScript());
383        //System.out.println("c = " + c.toScript());
384        //System.out.println("d = " + d.toScript());
385        assertTrue("a*b != b*a", c.equals(d) || c.leadingExpVector().equals(d.leadingExpVector()));
386
387        e = (QuotSolvablePolynomial<BigRational>) b.inverse();
388        //System.out.println("e = " + e.toScript());
389        assertTrue("b*b^-1 == 1", e.multiply(b).isONE());
390
391        c = e.multiply(c);
392        d = d.multiply(e);
393        //System.out.println("a = " + a.toScript());
394        //System.out.println("b = " + b.toScript());
395        //System.out.println("c = " + c.toScript());
396        //System.out.println("d = " + d.toScript());
397        assertTrue("a == b * 1/b * a", a.equals(c));
398        assertTrue("a == a * 1/b * b", a.equals(d));
399    }
400
401
402    /*
403     * Test extension and contraction for Weyl relations. public void
404     * testExtendContractWeyl() { GenSolvablePolynomialRing<BigRational> csring
405     * = new GenSolvablePolynomialRing<BigRational>(cfac, tord, cvars);
406     * RelationGenerator<BigRational> wlc = new WeylRelations<BigRational>();
407     * wlc.generate(csring); assertFalse("isCommutative()", csring.isCommutative());
408     * assertTrue("isAssociative()", csring.isAssociative());
409     * 
410     * QuotSolvablePolynomial<BigRational> r1 = ring.parse("x");
411     * GenSolvablePolynomial<BigRational> r2 = csring.parse("b");
412     * QuotSolvablePolynomial<BigRational> rp = ring.parse("b x + a");
413     * ring.polCoeff.coeffTable.update(r1.leadingExpVector(), r2.leadingExpVector(), rp);
414     * 
415     * int k = rl; QuotSolvablePolynomialRing<BigRational> pfe = ring.extend(k);
416     * //System.out.println("pfe = " + pfe);
417     * QuotSolvablePolynomialRing<BigRational> pfec = pfe.contract(k);
418     * //System.out.println("pfec = " + pfec); assertEquals("ring == pfec",
419     * ring, pfec);
420     * 
421     * QuotSolvablePolynomial<BigRational> a = ring.random(kl, ll, el, q);
422     * //System.out.println("a = " + a);
423     * 
424     * QuotSolvablePolynomial<BigRational> ae =
425     * (QuotSolvablePolynomial<BigRational>) a.extend(pfe, 0, 0);
426     * //System.out.println("ae = " + ae);
427     * 
428     * Map<ExpVector, GenPolynomial<GenPolynomial<BigRational>>> m =
429     * ae.contract(pfec); List<GenPolynomial<GenPolynomial<BigRational>>> ml =
430     * new ArrayList<GenPolynomial<GenPolynomial<BigRational>>>( m.values());
431     * GenPolynomial<GenPolynomial<BigRational>> aec = ml.get(0);
432     * //System.out.println("ae  = " + ae); //System.out.println("aec = " +
433     * aec); assertEquals("a == aec", a, aec); }
434     */
435
436
437    /*
438     * Test reversion for Weyl relations. public void testReverseWeyl() {
439     * GenSolvablePolynomialRing<BigRational> csring = new
440     * GenSolvablePolynomialRing<BigRational>(cfac, tord, cvars);
441     * RelationGenerator<BigRational> wlc = new WeylRelations<BigRational>();
442     * wlc.generate(csring); assertFalse("isCommutative()", csring.isCommutative());
443     * assertTrue("isAssociative()", csring.isAssociative());
444     * 
445     * QuotSolvablePolynomial<BigRational> r1 = ring.parse("x");
446     * GenSolvablePolynomial<BigRational> r2 = csring.parse("b");
447     * QuotSolvablePolynomial<BigRational> rp = ring.parse("b x + a");
448     * ring.polCoeff.coeffTable.update(r1.leadingExpVector(), r2.leadingExpVector(), rp);
449     * 
450     * QuotSolvablePolynomialRing<BigRational> pfr = ring.reverse();
451     * QuotSolvablePolynomialRing<BigRational> pfrr = pfr.reverse();
452     * assertEquals("pf == pfrr", ring, pfrr); //System.out.println("ring = " +
453     * ring); //System.out.println("pfr = " + pfr);
454     * 
455     * QuotSolvablePolynomial<BigRational> a = ring.random(kl, ll, el, q);
456     * //System.out.println("a = " + a);
457     * 
458     * QuotSolvablePolynomial<BigRational> ar =
459     * (QuotSolvablePolynomial<BigRational>) a.reverse(pfr);
460     * QuotSolvablePolynomial<BigRational> arr =
461     * (QuotSolvablePolynomial<BigRational>) ar.reverse(pfrr);
462     * assertEquals("a == arr", a, arr); //System.out.println("ar = " + ar);
463     * //System.out.println("arr = " + arr); }
464     */
465
466
467    /*
468     * Test recursive for Weyl relations. public void testRecursiveWeyl() {
469     * String[] svars = new String[] { "w", "x", "y", "z" };
470     * GenSolvablePolynomialRing<BigRational> sring = new
471     * GenSolvablePolynomialRing<BigRational>(cfac, tord, svars);
472     * RelationGenerator<BigRational> wlc = new WeylRelations<BigRational>();
473     * wlc.generate(sring); assertFalse("isCommutative()", sring.isCommutative());
474     * assertTrue("isAssociative()", sring.isAssociative());
475     * //System.out.println("sring = " + sring.toScript());
476     * 
477     * GenSolvablePolynomialRing<GenPolynomial<BigRational>> rsring =
478     * sring.recursive(2); // 1,2,3 //System.out.println("rsring = " + rsring);
479     * //.toScript()); System.out.println("rsring = " + rsring.toScript());
480     * 
481     * GenSolvablePolynomial<BigRational> ad, bd, cd, dd;
482     * QuotSolvablePolynomial<BigRational> ar, br, cr, dr; ad = sring.random(kl,
483     * ll, el, q); bd = sring.random(kl, ll, el, q); //ad =
484     * sring.parse("7/2 y^2 * z"); // - 15/2 w^2 + 262/225"); //bd =
485     * sring.parse("-10/13 x "); //+ 413/150"); //ad =
486     * (GenSolvablePolynomial<BigRational>) ad.monic(); //bd =
487     * (GenSolvablePolynomial<BigRational>) bd.monic();
488     * 
489     * //System.out.println("ad = " + ad); //System.out.println("bd = " + bd);
490     * 
491     * cd = ad.multiply(bd); //System.out.println("cd = " + cd);
492     * 
493     * ar = (QuotSolvablePolynomial<BigRational>) PolyUtil.<BigRational>
494     * recursive(rsring, ad); br = (QuotSolvablePolynomial<BigRational>)
495     * PolyUtil.<BigRational> recursive(rsring, bd);
496     * //System.out.println("ar = " + ar); //System.out.println("br = " + br);
497     * 
498     * cr = ar.multiply(br); //System.out.println("cr = " + cr);
499     * //System.out.println("cr.ring = " + cr.ring.toScript());
500     * 
501     * dr = (QuotSolvablePolynomial<BigRational>) PolyUtil.<BigRational>
502     * recursive(rsring, cd); //System.out.println("dr = " + dr);
503     * 
504     * assertEquals("dr.ring == cr.ring", dr.ring, cr.ring);
505     * assertEquals("dr == cr", dr, cr);
506     * 
507     * dd = (GenSolvablePolynomial<BigRational>) PolyUtil.<BigRational>
508     * distribute(sring, cr); //System.out.println("dd = " + dd);
509     * assertEquals("dd == cd", dd, cd); }
510     */
511
512
513    /*
514     * Test recursive for iterated Weyl relations. public void
515     * testRecursiveIteratedWeyl() { String[] svars = new String[] { "w", "x",
516     * "y", "z" }; GenSolvablePolynomialRing<BigRational> sring = new
517     * GenSolvablePolynomialRing<BigRational>(cfac, tord, svars);
518     * RelationGenerator<BigRational> wlc = new WeylRelationsIterated<BigRational>();
519     * wlc.generate(sring); assertFalse("isCommutative()",
520     * sring.isCommutative()); assertTrue("isAssociative()",
521     * sring.isAssociative()); //System.out.println("sring = " +
522     * sring.toScript());
523     * 
524     * GenSolvablePolynomialRing<GenPolynomial<BigRational>> rsring =
525     * sring.recursive(2); // 1,2,3 //System.out.println("rsring = " + rsring);
526     * //.toScript()); System.out.println("rsring = " + rsring.toScript());
527     * 
528     * GenSolvablePolynomial<BigRational> ad, bd, cd, dd;
529     * QuotSolvablePolynomial<BigRational> ar, br, cr, dr; ad = sring.random(kl,
530     * ll, el, q); bd = sring.random(kl, ll, el, q); //ad =
531     * (GenSolvablePolynomial<BigRational>) ad.monic(); //bd =
532     * (GenSolvablePolynomial<BigRational>) bd.monic();
533     * 
534     * //System.out.println("ad = " + ad); //System.out.println("bd = " + bd);
535     * 
536     * cd = ad.multiply(bd); //System.out.println("cd = " + cd);
537     * 
538     * ar = (QuotSolvablePolynomial<BigRational>) PolyUtil.<BigRational>
539     * recursive(rsring, ad); br = (QuotSolvablePolynomial<BigRational>)
540     * PolyUtil.<BigRational> recursive(rsring, bd);
541     * //System.out.println("ar = " + ar); //System.out.println("br = " + br);
542     * 
543     * cr = ar.multiply(br); //System.out.println("cr = " + cr);
544     * 
545     * dr = (QuotSolvablePolynomial<BigRational>) PolyUtil.<BigRational>
546     * recursive(rsring, cd); //System.out.println("dr = " + dr);
547     * 
548     * assertEquals("dr.ring == cr.ring", dr.ring, cr.ring);
549     * assertEquals("dr == cr", dr, cr);
550     * 
551     * dd = (GenSolvablePolynomial<BigRational>) PolyUtil.<BigRational>
552     * distribute(sring, cr); //System.out.println("dd = " + dd);
553     * assertEquals("dd == cd", dd, cd); }
554     */
555
556}