001 /* 002 * $Id: RatGenPolynomialTest.java 2831 2009-10-01 21:43:12Z kredel $ 003 */ 004 005 package edu.jas.poly; 006 007 import junit.framework.Test; 008 import junit.framework.TestCase; 009 import junit.framework.TestSuite; 010 import edu.jas.arith.BigRational; 011 012 013 /** 014 * BigRational coefficients GenPolynomial tests with JUnit. 015 * @author Heinz Kredel. 016 */ 017 018 public class RatGenPolynomialTest extends TestCase { 019 020 /** 021 * main. 022 */ 023 public static void main (String[] args) { 024 junit.textui.TestRunner.run( suite() ); 025 } 026 027 /** 028 * Constructs a <CODE>RatGenPolynomialTest</CODE> object. 029 * @param name String. 030 */ 031 public RatGenPolynomialTest(String name) { 032 super(name); 033 } 034 035 /** 036 */ 037 public static Test suite() { 038 TestSuite suite= new TestSuite(RatGenPolynomialTest.class); 039 return suite; 040 } 041 042 //private final static int bitlen = 100; 043 044 GenPolynomialRing<BigRational> fac; 045 046 GenPolynomial<BigRational> a; 047 GenPolynomial<BigRational> b; 048 GenPolynomial<BigRational> c; 049 GenPolynomial<BigRational> d; 050 GenPolynomial<BigRational> e; 051 052 int rl = 7; 053 int kl = 10; 054 int ll = 10; 055 int el = 5; 056 float q = 0.5f; 057 058 protected void setUp() { 059 a = b = c = d = e = null; 060 fac = new GenPolynomialRing<BigRational>(new BigRational(1),rl); 061 } 062 063 protected void tearDown() { 064 a = b = c = d = e = null; 065 fac = null; 066 } 067 068 069 /** 070 * Test constructor and toString. 071 * 072 */ 073 public void testConstruction() { 074 c = fac.getONE(); 075 assertTrue("length( c ) = 1", c.length() == 1); 076 assertTrue("isZERO( c )", !c.isZERO() ); 077 assertTrue("isONE( c )", c.isONE() ); 078 079 d = fac.getZERO(); 080 assertTrue("length( d ) = 0", d.length() == 0); 081 assertTrue("isZERO( d )", d.isZERO() ); 082 assertTrue("isONE( d )", !d.isONE() ); 083 } 084 085 086 /** 087 * Test random polynomial. 088 */ 089 public void testRandom() { 090 for (int i = 0; i < 7; i++) { 091 a = fac.random(ll); 092 //System.out.println("a = " + a); 093 094 // fac.random(rl+i, kl*(i+1), ll+2*i, el+i, q ); 095 assertTrue("length( a"+i+" ) <> 0", a.length() >= 0); 096 assertTrue(" not isZERO( a"+i+" )", !a.isZERO() ); 097 assertTrue(" not isONE( a"+i+" )", !a.isONE() ); 098 } 099 } 100 101 102 /** 103 * Test addition. 104 * 105 */ 106 public void testAddition() { 107 108 a = fac.random(ll); 109 b = fac.random(ll); 110 111 c = a.sum(b); 112 d = c.subtract(b); 113 assertEquals("a+b-b = a",a,d); 114 115 c = fac.random(ll); 116 117 ExpVector u = ExpVector.EVRAND(rl,el,q); 118 BigRational x = BigRational.RNRAND(kl); 119 120 b = new GenPolynomial<BigRational>(fac,x, u); 121 c = a.sum(b); 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 a = new GenPolynomial<BigRational>(fac); 130 b = new GenPolynomial<BigRational>(fac,x, u); 131 c = b.sum(a); 132 d = a.sum(x,u); 133 assertEquals("a+p(x,u) = a+(x,u)",c,d); 134 135 c = a.subtract(b); 136 d = a.subtract(x,u); 137 assertEquals("a-p(x,u) = a-(x,u)",c,d); 138 } 139 140 141 /** 142 * Test object multiplication. 143 * 144 */ 145 public void testMultiplication() { 146 147 a = fac.random(ll); 148 assertTrue("not isZERO( a )", !a.isZERO() ); 149 150 b = fac.random(ll); 151 assertTrue("not isZERO( b )", !b.isZERO() ); 152 153 c = b.multiply(a); 154 d = a.multiply(b); 155 assertTrue("not isZERO( c )", !c.isZERO() ); 156 assertTrue("not isZERO( d )", !d.isZERO() ); 157 158 //System.out.println("a = " + a); 159 //System.out.println("b = " + b); 160 e = d.subtract(c); 161 assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() ); 162 163 assertTrue("a*b = b*a", c.equals(d) ); 164 assertEquals("a*b = b*a",c,d); 165 166 c = fac.random(ll); 167 //System.out.println("c = " + c); 168 d = a.multiply( b.multiply(c) ); 169 e = (a.multiply(b)).multiply(c); 170 171 //System.out.println("d = " + d); 172 //System.out.println("e = " + e); 173 174 //System.out.println("d-e = " + d.subtract(c) ); 175 176 assertEquals("a(bc) = (ab)c",d,e); 177 assertTrue("a(bc) = (ab)c", d.equals(e) ); 178 179 BigRational x = a.leadingBaseCoefficient().inverse(); 180 c = a.monic(); 181 d = a.multiply(x); 182 assertEquals("a.monic() = a(1/ldcf(a))",c,d); 183 184 BigRational y = b.leadingBaseCoefficient().inverse(); 185 c = b.monic(); 186 d = b.multiply(y); 187 assertEquals("b.monic() = b(1/ldcf(b))",c,d); 188 189 e = new GenPolynomial<BigRational>(fac,y); 190 d = b.multiply(e); 191 assertEquals("b.monic() = b(1/ldcf(b))",c,d); 192 193 d = e.multiply(b); 194 assertEquals("b.monic() = (1/ldcf(b) (0))*b",c,d); 195 } 196 197 198 /** 199 * Test distributive law. 200 * 201 */ 202 public void testDistributive() { 203 a = fac.random(kl,ll,el,q); 204 b = fac.random(kl,ll,el,q); 205 c = fac.random(kl,ll,el,q); 206 207 d = a.multiply( b.sum(c) ); 208 e = a.multiply( b ).sum( a.multiply(c) ); 209 210 assertEquals("a(b+c) = ab+ac",d,e); 211 } 212 213 214 /** 215 * Test object quotient and remainder. 216 * 217 */ 218 219 public void testQuotRem() { 220 221 fac = new GenPolynomialRing<BigRational>(new BigRational(1),1); 222 223 a = fac.random(ll).monic(); 224 assertTrue("not isZERO( a )", !a.isZERO() ); 225 226 b = fac.random(ll).monic(); 227 assertTrue("not isZERO( b )", !b.isZERO() ); 228 229 GenPolynomial<BigRational> h = a; 230 GenPolynomial<BigRational> g = fac.random(ll).monic(); 231 assertTrue("not isZERO( g )", !g.isZERO() ); 232 a = a.multiply(g); 233 b = b.multiply(g); 234 //System.out.println("a = " + a); 235 //System.out.println("b = " + b); 236 //System.out.println("g = " + g); 237 238 GenPolynomial<BigRational>[] qr; 239 qr = b.divideAndRemainder(a); 240 c = qr[0]; 241 d = qr[1]; 242 //System.out.println("q = " + c); 243 //System.out.println("r = " + d); 244 e = c.multiply(a).sum(d); 245 assertEquals("b = q a + r", b, e ); 246 247 qr = a.divideAndRemainder(b); 248 c = qr[0]; 249 d = qr[1]; 250 //System.out.println("q = " + c); 251 //System.out.println("r = " + d); 252 e = c.multiply(b).sum(d); 253 assertEquals("a = q b + r", a, e ); 254 255 256 // gcd tests ------------------------------- 257 c = a.gcd(b); 258 //System.out.println("gcd = " + c); 259 assertTrue("a mod gcd(a,b) = 0", a.remainder(c).isZERO() ); 260 assertTrue("b mod gcd(a,b) = 0", b.remainder(c).isZERO() ); 261 assertEquals("g = gcd(a,b)", c, g ); 262 263 264 GenPolynomial<BigRational>[] gst; 265 gst = a.egcd(b); 266 //System.out.println("egcd = " + gst[0]); 267 //System.out.println(", s = " + gst[1] + ", t = " + gst[2]); 268 c = gst[0]; 269 d = gst[1]; 270 e = gst[2]; 271 assertEquals("g = gcd(a,b)", c, g ); 272 273 GenPolynomial<BigRational> x; 274 x = a.multiply(d).sum( b.multiply(e) ).monic(); 275 //System.out.println("x = " + x); 276 assertEquals("gcd(a,b) = a s + b t", c, x ); 277 278 279 gst = a.hegcd(b); 280 //System.out.println("hegcd = " + gst[0]); 281 //System.out.println("s = " + gst[1]); 282 c = gst[0]; 283 d = gst[1]; 284 assertEquals("g = gcd(a,b)", c, g ); 285 286 x = a.multiply(d).remainder(b).monic(); 287 //System.out.println("x = " + x); 288 assertEquals("gcd(a,b) = a s mod b", c, x ); 289 290 //System.out.println("g = " + g); 291 //System.out.println("h = " + h); 292 c = h.modInverse(g); 293 //System.out.println("c = " + c); 294 x = c.multiply(h).remainder( g ).monic(); 295 //System.out.println("x = " + x); 296 assertTrue("h invertible mod g", x.isONE() ); 297 298 } 299 300 }