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}