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