001 002/* 003 * $Id: ResidueTest.java 3887 2012-02-11 12:48:43Z kredel $ 004 */ 005 006package edu.jas.application; 007 008import java.util.ArrayList; 009import java.util.List; 010 011import junit.framework.Test; 012import junit.framework.TestCase; 013import junit.framework.TestSuite; 014 015//import org.apache.log4j.BasicConfigurator; 016//import org.apache.log4j.Logger; 017 018import edu.jas.arith.BigRational; 019 020//import edu.jas.structure.RingElem; 021 022import edu.jas.poly.GenPolynomial; 023import edu.jas.poly.GenPolynomialRing; 024 025 026/** 027 * Residue tests with JUnit. 028 * @author Heinz Kredel. 029 */ 030 031public 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 assert !id.isONE() : "id = " + id; 091 fac = new ResidueRing<BigRational>( id ); 092 //System.out.println("fac = " + fac); 093 F = null; 094 } 095 096 protected void tearDown() { 097 a = b = c = d = e = null; 098 fac = null; 099 id = null; 100 mfac = null; 101 } 102 103 104/** 105 * Test constructor and toString. 106 * 107 */ 108 public void testConstruction() { 109 c = fac.getONE(); 110 //System.out.println("c = " + c); 111 //System.out.println("c.val = " + c.val); 112 assertTrue("length( c ) = 1 ", c.val.length() == 1 || id.isONE()); 113 assertTrue("isZERO( c )", !c.isZERO() || id.isONE()); 114 assertTrue("isONE( c )", c.isONE() || id.isONE()); 115 116 d = fac.getZERO(); 117 //System.out.println("d = " + d); 118 //System.out.println("d.val = " + d.val); 119 assertTrue("length( d ) = 0", d.val.length() == 0); 120 assertTrue("isZERO( d )", d.isZERO() ); 121 assertTrue("isONE( d )", !d.isONE() ); 122 } 123 124 125/** 126 * Test random polynomial. 127 * 128 */ 129 public void testRandom() { 130 for (int i = 0; i < 7; i++) { 131 //a = fac.random(ll+i); 132 a = fac.random(kl*(i+1), ll+2*i, el+i, q ); 133 //System.out.println("a = " + a); 134 if ( a.isZERO() || a.isONE() ) { 135 continue; 136 } 137 assertTrue("length( a"+i+" ) <> 0", a.val.length() >= 0); 138 assertTrue(" not isZERO( a"+i+" )", !a.isZERO() ); 139 assertTrue(" not isONE( a"+i+" )", !a.isONE() ); 140 } 141 } 142 143 144/** 145 * Test addition. 146 * 147 */ 148 public void testAddition() { 149 150 a = fac.random(kl,ll,el,q); 151 b = fac.random(kl,ll,el,q); 152 153 c = a.sum(b); 154 d = c.subtract(b); 155 assertEquals("a+b-b = a",a,d); 156 157 c = a.sum(b); 158 d = b.sum(a); 159 assertEquals("a+b = b+a",c,d); 160 161 c = fac.random(kl,ll,el,q); 162 d = c.sum( a.sum(b) ); 163 e = c.sum( a ).sum(b); 164 assertEquals("c+(a+b) = (c+a)+b",d,e); 165 166 167 c = a.sum( fac.getZERO() ); 168 d = a.subtract( fac.getZERO() ); 169 assertEquals("a+0 = a-0",c,d); 170 171 c = fac.getZERO().sum( a ); 172 d = fac.getZERO().subtract( a.negate() ); 173 assertEquals("0+a = 0+(-a)",c,d); 174 175 } 176 177 178/** 179 * Test object multiplication. 180 * 181 */ 182 183 public void testMultiplication() { 184 185 a = fac.random(kl,ll,el,q); 186 if ( a.isZERO() ) { 187 return; 188 } 189 assertTrue("not isZERO( a )", !a.isZERO() ); 190 a = a.monic(); 191 192 b = fac.random(kl,ll,el,q); 193 if ( b.isZERO() ) { 194 return; 195 } 196 assertTrue("not isZERO( b )", !b.isZERO() ); 197 b = b.monic(); 198 199 c = b.multiply(a); 200 d = a.multiply(b); 201 assertTrue("not isZERO( c )", !c.isZERO() ); 202 assertTrue("not isZERO( d )", !d.isZERO() ); 203 204 //System.out.println("a = " + a); 205 //System.out.println("b = " + b); 206 e = d.subtract(c); 207 assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() ); 208 209 assertTrue("a*b = b*a", c.equals(d) ); 210 assertEquals("a*b = b*a",c,d); 211 212 d = c.remainder(a); 213 //System.out.println("c = " + c); 214 //System.out.println("d = " + d); 215 if ( d.isZERO() ) { 216 d = c.divide(a); 217 //System.out.println("c = " + c); 218 //System.out.println("d = " + d); 219 e = d.multiply(a); 220 //System.out.println("e = " + e); 221 assertEquals("((b*a)/a)*a = b*a",e,c); 222 } 223 224 c = fac.random(kl,ll,el,q); 225 //System.out.println("c = " + c); 226 d = a.multiply( b.multiply(c) ); 227 e = (a.multiply(b)).multiply(c); 228 229 //System.out.println("d = " + d); 230 //System.out.println("e = " + e); 231 232 //System.out.println("d-e = " + d.subtract(c) ); 233 234 assertEquals("a(bc) = (ab)c",d,e); 235 assertTrue("a(bc) = (ab)c", d.equals(e) ); 236 237 c = a.multiply( fac.getONE() ); 238 d = fac.getONE().multiply( a ); 239 assertEquals("a*1 = 1*a",c,d); 240 241 if ( a.isUnit() ) { 242 c = a.inverse(); 243 d = c.multiply(a); 244 //System.out.println("a = " + a); 245 //System.out.println("c = " + c); 246 //System.out.println("d = " + d); 247 assertTrue("a*1/a = 1",d.isONE()); 248 } 249 } 250 251}