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 }