001/*
002 * $Id: IntGenPolynomialTest.java 5949 2018-10-28 11:33:58Z kredel $
003 */
004
005package edu.jas.poly;
006
007import junit.framework.Test;
008import junit.framework.TestCase;
009import junit.framework.TestSuite;
010
011import edu.jas.poly.GenPolynomial;
012import edu.jas.arith.BigInteger;
013
014
015/**
016 * BigInteger coefficients GenPolynomial tests with JUnit.
017 * @author Heinz Kredel
018 */
019
020public class IntGenPolynomialTest extends TestCase {
021
022    /**
023     * main.
024     */
025    public static void main (String[] args) {
026        junit.textui.TestRunner.run( suite() );
027    }
028
029    /**
030     * Constructs a <CODE>IntGenPolynomialTest</CODE> object.
031     * @param name String.
032     */
033    public IntGenPolynomialTest(String name) {
034        super(name);
035    }
036
037    /**
038     */ 
039    public static Test suite() {
040        TestSuite suite= new TestSuite(IntGenPolynomialTest.class);
041        return suite;
042    }
043
044    GenPolynomialRing<BigInteger> fac;
045
046    GenPolynomial<BigInteger> a, b, c, d, e;
047
048    int rl = 7; 
049    int kl = 10;
050    int ll = 10;
051    int el = 5;
052    float q = 0.3f;
053
054    protected void setUp() {
055        a = b = c = d = e = null;
056        fac = new GenPolynomialRing<BigInteger>(new BigInteger(1),rl);
057    }
058
059    protected void tearDown() {
060        a = b = c = d = e = null;
061        fac = null;
062    }
063
064
065    /**
066     * Test constructor and toString.
067     */
068    public void testConstruction() {
069        c = fac.getONE();
070        assertTrue("length( c ) = 1", c.length() == 1);
071        assertTrue("isZERO( c )", !c.isZERO() );
072        assertTrue("isONE( c )", c.isONE() );
073
074        d = fac.getZERO();
075        assertTrue("length( d ) = 0", d.length() == 0);
076        assertTrue("isZERO( d )", d.isZERO() );
077        assertTrue("isONE( d )", !d.isONE() );
078    }
079
080
081    /**
082     * Test random polynomial.
083     */
084    public void testRandom() {
085        for (int i = 0; i < 7; i++) {
086            a = fac.random(kl*(i+2),ll+2*i,el+i,q);
087            assertTrue("length( a"+i+" ) <> 0", a.length() >= 0);
088            assertTrue(" not isZERO( a"+i+" )", !a.isZERO() );
089            assertTrue(" not isONE( a"+i+" )", !a.isONE() );
090        }
091    }
092
093
094    /**
095     * Test addition.
096     */
097    public void testAddition() {
098        a = fac.random(kl,ll,el,q);
099        b = fac.random(kl,ll,el,q);
100
101        c = a.sum(b);
102        d = c.subtract(b);
103        assertEquals("a+b-b = a",a,d);
104
105        c = fac.random(kl,ll,el,q);
106
107        ExpVector u = ExpVector.random(rl,el,q);
108        BigInteger x = BigInteger.IRAND(kl);
109
110        b = new GenPolynomial<BigInteger>(fac,x, u);
111        c = a.sum(b);
112        d = a.sum(x,u);
113        assertEquals("a+p(x,u) = a+(x,u)",c,d);
114
115        c = a.subtract(b);
116        d = a.subtract(x,u);
117        assertEquals("a-p(x,u) = a-(x,u)",c,d);
118
119        a = new GenPolynomial<BigInteger>(fac);
120        b = new GenPolynomial<BigInteger>(fac,x, u);
121        c = b.sum(a);
122        d = a.sum(x,u);
123        assertEquals("a+p(x,u) = a+(x,u)",c,d);
124
125        c = a.subtract(b);
126        d = a.subtract(x,u);
127        assertEquals("a-p(x,u) = a-(x,u)",c,d);
128    }
129
130
131    /**
132     * Test object multiplication.
133     */
134    public void testMultiplication() {
135        a = fac.random(kl,ll,el,q);
136        assertTrue("not isZERO( a )", !a.isZERO() );
137
138        b = fac.random(kl,ll,el,q);
139        assertTrue("not isZERO( b )", !b.isZERO() );
140
141        c = b.multiply(a);
142        d = a.multiply(b);
143        assertTrue("not isZERO( c )", !c.isZERO() );
144        assertTrue("not isZERO( d )", !d.isZERO() );
145
146        //System.out.println("a = " + a);
147        //System.out.println("b = " + b);
148        e = d.subtract(c);
149        assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() );
150
151        assertTrue("a*b = b*a", c.equals(d) );
152        assertEquals("a*b = b*a",c,d);
153
154        c = fac.random(kl,ll,el,q);
155        //System.out.println("c = " + c);
156        d = a.multiply( b.multiply(c) );
157        e = (a.multiply(b)).multiply(c);
158        //System.out.println("d = " + d);
159        //System.out.println("e = " + e);
160        //System.out.println("d-e = " + d.subtract(c) );
161        assertEquals("a(bc) = (ab)c",d,e);
162        assertTrue("a(bc) = (ab)c", d.equals(e) );
163
164        //BigInteger x = a.leadingBaseCoefficient().inverse();
165        //c = a.monic();
166        //d = a.multiply(x);
167        //assertEquals("a.monic() = a(1/ldcf(a))",c,d);
168
169        BigInteger y = b.leadingBaseCoefficient();
170        //c = b.monic();
171        //d = b.multiply(y);
172        //assertEquals("b.monic() = b(1/ldcf(b))",c,d);
173
174        e = new GenPolynomial<BigInteger>(fac,y);
175        c = b.multiply(e);
176        // assertEquals("b.monic() = b(1/ldcf(b))",c,d);
177
178        d = e.multiply(b);
179        assertEquals("b*p(y,u) = p(y,u)*b",c,d);
180    }
181
182
183    /**
184     * Test BLAS level 1.
185     */
186    public void testBLAS1() {
187        a = fac.random(kl,ll,el,q);
188        b = fac.random(kl,ll,el,q);
189        ExpVector ev = ExpVector.random(rl,el,q);
190        BigInteger lc = BigInteger.IRAND(kl);
191
192        d = a.subtractMultiple(lc,b);
193        e = a.subtract( b.multiply(lc) );
194        assertEquals("a - (lc) b == a - ((lc) b)",d,e);
195
196        d = a.subtractMultiple(lc,ev,b);
197        e = a.subtract( b.multiply(lc,ev) );
198        assertEquals("a - (lc ev) b == a - ((lc ev) b)",d,e);
199
200        ExpVector fv = ExpVector.random(rl,el,q);
201        BigInteger tc = BigInteger.IRAND(kl);
202
203        d = a.scaleSubtractMultiple(tc,lc,ev,b);
204        e = a.multiply(tc).subtract( b.multiply(lc,ev) );
205        assertEquals("(tc) a - (lc ev) b == ((tc) a - ((lc ev) b))",d,e);
206
207        d = a.scaleSubtractMultiple(tc,fv,lc,ev,b);
208        e = a.multiply(tc,fv).subtract( b.multiply(lc,ev) );
209        assertEquals("(tc fv) a - (lc ev) b == ((tc fv) a - ((lc ev) b))",d,e);
210    }
211
212
213    /**
214     * Test distributive law.
215     */
216    public void testDistributive() {
217        a = fac.random(kl,ll,el,q);
218        b = fac.random(kl,ll,el,q);
219        c = fac.random(kl,ll,el,q);
220
221        d = a.multiply( b.sum(c) );
222        e = a.multiply( b ).sum( a.multiply(c) );
223
224        assertEquals("a(b+c) = ab+ac",d,e);
225    }
226
227
228    /**
229     * Test absolute norm.
230     */
231    public void testAbsNorm() {
232        BigInteger r, ar;
233        a = fac.getONE().negate();
234        //System.out.println("a = " + a);
235
236        r = PolyUtil.<BigInteger> absNorm(a);
237        //System.out.println("r = " + r);
238        assertTrue("isONE( absNorm(-1) )", r.isONE() );
239
240        a = fac.random(kl*2, ll+2, el, q );
241        //System.out.println("a = " + a);
242
243        r = PolyUtil.<BigInteger> absNorm(a);
244        //System.out.println("r = " + r);
245        assertTrue(" not isZERO( absNorm(a) )", !r.isZERO() || a.isZERO() );
246    }
247
248}