001
002/*
003 * $Id$
004 */
005
006package edu.jas.application;
007
008
009import java.util.ArrayList;
010import java.util.List;
011
012
013import edu.jas.arith.BigRational;
014import edu.jas.poly.GenPolynomial;
015import edu.jas.poly.GenPolynomialRing;
016
017import junit.framework.Test;
018import junit.framework.TestCase;
019import junit.framework.TestSuite;
020
021
022/**
023 * Residue tests with JUnit.
024 * @author Heinz Kredel
025 */
026
027public class ResidueTest extends TestCase {
028
029
030    /**
031     * main.
032     */
033    public static void main(String[] args) {
034        //
035        junit.textui.TestRunner.run(suite());
036    }
037
038
039    /**
040     * Constructs a <CODE>ResidueTest</CODE> object.
041     * @param name String.
042     */
043    public ResidueTest(String name) {
044        super(name);
045    }
046
047
048    /**
049     * suite.
050     */
051    public static Test suite() {
052        TestSuite suite = new TestSuite(ResidueTest.class);
053        return suite;
054    }
055
056    //private final static int bitlen = 100;
057
058    Ideal<BigRational> id;
059
060
061    ResidueRing<BigRational> fac;
062
063
064    GenPolynomialRing<BigRational> mfac;
065
066
067    List<GenPolynomial<BigRational>> F;
068
069
070    Residue<BigRational> a;
071
072
073    Residue<BigRational> b;
074
075
076    Residue<BigRational> c;
077
078
079    Residue<BigRational> d;
080
081
082    Residue<BigRational> e;
083
084
085    int rl = 3;
086
087
088    int kl = 3;
089
090
091    int ll = 7;
092
093
094    int el = 3;
095
096
097    float q = 0.4f;
098
099
100    int il = (rl == 1 ? 1 : 2);
101
102    @Override
103    protected void setUp() {
104        a = b = c = d = e = null;
105        mfac = new GenPolynomialRing<BigRational>(new BigRational(1), rl);
106        F = new ArrayList<GenPolynomial<BigRational>>(il);
107        for (int i = 0; i < il; i++) {
108            GenPolynomial<BigRational> mo = mfac.random(kl, ll, el, q);
109            while (mo.isConstant()) {
110                mo = mfac.random(kl, ll, el, q);
111            }
112            F.add(mo);
113        }
114        id = new Ideal<BigRational>(mfac, F);
115        //System.out.println("id = " + id);
116        assert !id.isONE() : "id = " + id;
117        fac = new ResidueRing<BigRational>(id);
118        //System.out.println("fac = " + fac);
119        F = null;
120    }
121
122
123    @Override
124    protected void tearDown() {
125        a = b = c = d = e = null;
126        fac = null;
127        id = null;
128        mfac = null;
129    }
130
131
132    /**
133     * Test constructor and toString.
134     */
135    public void testConstruction() {
136        c = fac.getONE();
137        //System.out.println("c = " + c);
138        //System.out.println("c.val = " + c.val);
139        assertTrue("length( c ) = 1 ", c.val.length() == 1 || id.isONE());
140        assertTrue("isZERO( c )", !c.isZERO() || id.isONE());
141        assertTrue("isONE( c )", c.isONE() || id.isONE());
142
143        d = fac.getZERO();
144        //System.out.println("d = " + d);
145        //System.out.println("d.val = " + d.val);
146        assertTrue("length( d ) = 0", d.val.length() == 0);
147        assertTrue("isZERO( d )", d.isZERO());
148        assertTrue("isONE( d )", !d.isONE());
149    }
150
151
152    /**
153     * Test random polynomial.
154     */
155    public void testRandom() {
156        for (int i = 0; i < 7; i++) {
157            //a = fac.random(ll+i);
158            a = fac.random(kl * (i + 1), ll + 2 * i, el + i, q);
159            //System.out.println("a = " + a);
160            if (a.isZERO() || a.isONE()) {
161                continue;
162            }
163            assertTrue("length( a" + i + " ) <> 0", a.val.length() >= 0);
164            assertTrue(" not isZERO( a" + i + " )", !a.isZERO());
165            assertTrue(" not isONE( a" + i + " )", !a.isONE());
166        }
167    }
168
169
170    /**
171     * Test addition.
172     */
173    public void testAddition() {
174        a = fac.random(kl, ll, el, q);
175        b = fac.random(kl, ll, el, q);
176
177        c = a.sum(b);
178        d = c.subtract(b);
179        assertEquals("a+b-b = a", a, d);
180
181        c = a.sum(b);
182        d = b.sum(a);
183        assertEquals("a+b = b+a", c, d);
184
185        c = fac.random(kl, ll, el, q);
186        d = c.sum(a.sum(b));
187        e = c.sum(a).sum(b);
188        assertEquals("c+(a+b) = (c+a)+b", d, e);
189
190
191        c = a.sum(fac.getZERO());
192        d = a.subtract(fac.getZERO());
193        assertEquals("a+0 = a-0", c, d);
194
195        c = fac.getZERO().sum(a);
196        d = fac.getZERO().subtract(a.negate());
197        assertEquals("0+a = 0+(-a)", c, d);
198
199    }
200
201
202    /**
203     * Test object multiplication.
204     */
205    public void testMultiplication() {
206        a = fac.random(kl, ll, el, q);
207        if (a.isZERO()) {
208            return;
209        }
210        assertTrue("not isZERO( a )", !a.isZERO());
211        a = a.monic();
212
213        b = fac.random(kl, ll, el, q);
214        if (b.isZERO()) {
215            return;
216        }
217        assertTrue("not isZERO( b )", !b.isZERO());
218        b = b.monic();
219
220        c = b.multiply(a);
221        d = a.multiply(b);
222        assertTrue("not isZERO( c )", !c.isZERO());
223        assertTrue("not isZERO( d )", !d.isZERO());
224
225        //System.out.println("a = " + a);
226        //System.out.println("b = " + b);
227        e = d.subtract(c);
228        assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO());
229
230        assertTrue("a*b = b*a", c.equals(d));
231        assertEquals("a*b = b*a", c, d);
232
233        d = c.remainder(a);
234        //System.out.println("c = " + c);
235        //System.out.println("d = " + d);
236        if (d.isZERO()) {
237            d = c.divide(a);
238            //System.out.println("c = " + c);
239            //System.out.println("d = " + d);
240            e = d.multiply(a);
241            //System.out.println("e = " + e);
242            assertEquals("((b*a)/a)*a = b*a", e, c);
243        }
244
245        c = fac.random(kl, ll, el, q);
246        //System.out.println("c = " + c);
247        d = a.multiply(b.multiply(c));
248        e = (a.multiply(b)).multiply(c);
249
250        //System.out.println("d = " + d);
251        //System.out.println("e = " + e);
252
253        //System.out.println("d-e = " + d.subtract(c) );
254
255        assertEquals("a(bc) = (ab)c", d, e);
256        assertTrue("a(bc) = (ab)c", d.equals(e));
257
258        c = a.multiply(fac.getONE());
259        d = fac.getONE().multiply(a);
260        assertEquals("a*1 = 1*a", c, d);
261
262        if (a.isUnit()) {
263            c = a.inverse();
264            d = c.multiply(a);
265            //System.out.println("a = " + a);
266            //System.out.println("c = " + c);
267            //System.out.println("d = " + d);
268            assertTrue("a*1/a = 1", d.isONE());
269        }
270    }
271
272}