001/* 002 * $Id: RatGenPolynomialTest.java 4284 2012-11-03 18:32:04Z kredel $ 003 */ 004 005package edu.jas.poly; 006 007import junit.framework.Test; 008import junit.framework.TestCase; 009import junit.framework.TestSuite; 010import edu.jas.arith.BigRational; 011 012 013/** 014 * BigRational coefficients GenPolynomial tests with JUnit. 015 * @author Heinz Kredel. 016 */ 017 018public 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 public void testConstruction() { 073 c = fac.getONE(); 074 assertTrue("length( c ) = 1", c.length() == 1); 075 assertTrue("isZERO( c )", !c.isZERO() ); 076 assertTrue("isONE( c )", c.isONE() ); 077 078 d = fac.getZERO(); 079 assertTrue("length( d ) = 0", d.length() == 0); 080 assertTrue("isZERO( d )", d.isZERO() ); 081 assertTrue("isONE( d )", !d.isONE() ); 082 } 083 084 085/** 086 * Test random polynomial. 087 */ 088 public void testRandom() { 089 for (int i = 0; i < 7; i++) { 090 a = fac.random(ll); 091 //System.out.println("a = " + a); 092 093 // fac.random(rl+i, kl*(i+1), ll+2*i, el+i, q ); 094 assertTrue("length( a"+i+" ) <> 0", a.length() >= 0); 095 assertTrue(" not isZERO( a"+i+" )", !a.isZERO() ); 096 assertTrue(" not isONE( a"+i+" )", !a.isONE() ); 097 } 098 } 099 100 101/** 102 * Test addition. 103 */ 104 public void testAddition() { 105 106 a = fac.random(ll); 107 b = fac.random(ll); 108 109 c = a.sum(b); 110 d = c.subtract(b); 111 assertEquals("a+b-b = a",a,d); 112 113 c = fac.random(ll); 114 115 ExpVector u = ExpVector.EVRAND(rl,el,q); 116 BigRational x = BigRational.RNRAND(kl); 117 118 b = new GenPolynomial<BigRational>(fac,x, u); 119 c = a.sum(b); 120 d = a.sum(x,u); 121 assertEquals("a+p(x,u) = a+(x,u)",c,d); 122 123 c = a.subtract(b); 124 d = a.subtract(x,u); 125 assertEquals("a-p(x,u) = a-(x,u)",c,d); 126 127 a = new GenPolynomial<BigRational>(fac); 128 b = new GenPolynomial<BigRational>(fac,x, u); 129 c = b.sum(a); 130 d = a.sum(x,u); 131 assertEquals("a+p(x,u) = a+(x,u)",c,d); 132 133 c = a.subtract(b); 134 d = a.subtract(x,u); 135 assertEquals("a-p(x,u) = a-(x,u)",c,d); 136 } 137 138 139/** 140 * Test object multiplication. 141 */ 142 public void testMultiplication() { 143 144 a = fac.random(ll); 145 assertTrue("not isZERO( a )", !a.isZERO() ); 146 147 b = fac.random(ll); 148 assertTrue("not isZERO( b )", !b.isZERO() ); 149 150 c = b.multiply(a); 151 d = a.multiply(b); 152 assertTrue("not isZERO( c )", !c.isZERO() ); 153 assertTrue("not isZERO( d )", !d.isZERO() ); 154 155 //System.out.println("a = " + a); 156 //System.out.println("b = " + b); 157 e = d.subtract(c); 158 assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() ); 159 160 assertTrue("a*b = b*a", c.equals(d) ); 161 assertEquals("a*b = b*a",c,d); 162 163 c = fac.random(ll); 164 //System.out.println("c = " + c); 165 d = a.multiply( b.multiply(c) ); 166 e = (a.multiply(b)).multiply(c); 167 168 //System.out.println("d = " + d); 169 //System.out.println("e = " + e); 170 171 //System.out.println("d-e = " + d.subtract(c) ); 172 173 assertEquals("a(bc) = (ab)c",d,e); 174 assertTrue("a(bc) = (ab)c", d.equals(e) ); 175 176 BigRational x = a.leadingBaseCoefficient().inverse(); 177 c = a.monic(); 178 d = a.multiply(x); 179 assertEquals("a.monic() = a(1/ldcf(a))",c,d); 180 181 BigRational y = b.leadingBaseCoefficient().inverse(); 182 c = b.monic(); 183 d = b.multiply(y); 184 assertEquals("b.monic() = b(1/ldcf(b))",c,d); 185 186 e = new GenPolynomial<BigRational>(fac,y); 187 d = b.multiply(e); 188 assertEquals("b.monic() = b(1/ldcf(b))",c,d); 189 190 d = e.multiply(b); 191 assertEquals("b.monic() = (1/ldcf(b) (0))*b",c,d); 192 } 193 194 195/** 196 * Test BLAS level 1. 197 */ 198 public void testBLAS1() { 199 a = fac.random(kl,ll,el,q); 200 b = fac.random(kl,ll,el,q); 201 c = fac.random(kl,3,el*el,q); 202 ExpVector ev = ExpVector.EVRAND(rl,el,q); 203 BigRational lc = BigRational.RNRAND(kl); 204 205 d = a.subtractMultiple(lc,b); 206 e = a.subtract( b.multiply(lc) ); 207 assertEquals("a - (lc) b == a - ((lc) b)",d,e); 208 209 d = a.subtractMultiple(lc,ev,b); 210 e = a.subtract( b.multiply(lc,ev) ); 211 assertEquals("a - (lc ev) b == a - ((lc ev) b)",d,e); 212 213 ExpVector fv = ExpVector.EVRAND(rl,el,q); 214 BigRational tc = BigRational.RNRAND(kl); 215 216 d = a.scaleSubtractMultiple(tc,lc,ev,b); 217 e = a.multiply(tc).subtract( b.multiply(lc,ev) ); 218 assertEquals("(tc) a - (lc ev) b == ((tc) a - ((lc ev) b))",d,e); 219 220 d = a.scaleSubtractMultiple(tc,fv,lc,ev,b); 221 e = a.multiply(tc,fv).subtract( b.multiply(lc,ev) ); 222 assertEquals("(tc fv) a - (lc ev) b == ((tc fv) a - ((lc ev) b))",d,e); 223 } 224 225 226/** 227 * Test distributive law. 228 */ 229 public void testDistributive() { 230 a = fac.random(kl,ll,el,q); 231 b = fac.random(kl,ll,el,q); 232 c = fac.random(kl,ll,el,q); 233 234 d = a.multiply( b.sum(c) ); 235 e = a.multiply( b ).sum( a.multiply(c) ); 236 237 assertEquals("a(b+c) == ab+ac",d,e); 238 } 239 240 241/** 242 * Test object quotient and remainder. 243 */ 244 public void testQuotRem() { 245 246 fac = new GenPolynomialRing<BigRational>(new BigRational(1),1); 247 248 a = fac.random(ll).monic(); 249 assertTrue("not isZERO( a )", !a.isZERO() ); 250 251 b = fac.random(ll).monic(); 252 assertTrue("not isZERO( b )", !b.isZERO() ); 253 254 GenPolynomial<BigRational> h = a; 255 GenPolynomial<BigRational> g = fac.random(ll).monic(); 256 assertTrue("not isZERO( g )", !g.isZERO() ); 257 a = a.multiply(g); 258 b = b.multiply(g); 259 //System.out.println("a = " + a); 260 //System.out.println("b = " + b); 261 //System.out.println("g = " + g); 262 263 GenPolynomial<BigRational>[] qr; 264 qr = b.divideAndRemainder(a); 265 c = qr[0]; 266 d = qr[1]; 267 //System.out.println("q = " + c); 268 //System.out.println("r = " + d); 269 e = c.multiply(a).sum(d); 270 assertEquals("b = q a + r", b, e ); 271 272 qr = a.divideAndRemainder(b); 273 c = qr[0]; 274 d = qr[1]; 275 //System.out.println("q = " + c); 276 //System.out.println("r = " + d); 277 e = c.multiply(b).sum(d); 278 assertEquals("a = q b + r", a, e ); 279 280 281 // gcd tests ------------------------------- 282 c = a.gcd(b); 283 //System.out.println("gcd = " + c); 284 assertTrue("a mod gcd(a,b) = 0", a.remainder(c).isZERO() ); 285 assertTrue("b mod gcd(a,b) = 0", b.remainder(c).isZERO() ); 286 assertEquals("g = gcd(a,b)", c, g ); 287 288 289 GenPolynomial<BigRational>[] gst; 290 gst = a.egcd(b); 291 //System.out.println("egcd = " + gst[0]); 292 //System.out.println(", s = " + gst[1] + ", t = " + gst[2]); 293 c = gst[0]; 294 d = gst[1]; 295 e = gst[2]; 296 assertEquals("g = gcd(a,b)", c, g ); 297 298 GenPolynomial<BigRational> x; 299 x = a.multiply(d).sum( b.multiply(e) ).monic(); 300 //System.out.println("x = " + x); 301 assertEquals("gcd(a,b) = a s + b t", c, x ); 302 303 304 gst = a.hegcd(b); 305 //System.out.println("hegcd = " + gst[0]); 306 //System.out.println("s = " + gst[1]); 307 c = gst[0]; 308 d = gst[1]; 309 assertEquals("g = gcd(a,b)", c, g ); 310 311 x = a.multiply(d).remainder(b).monic(); 312 //System.out.println("x = " + x); 313 assertEquals("gcd(a,b) = a s mod b", c, x ); 314 315 //System.out.println("g = " + g); 316 //System.out.println("h = " + h); 317 c = h.modInverse(g); 318 //System.out.println("c = " + c); 319 x = c.multiply(h).remainder( g ).monic(); 320 //System.out.println("x = " + x); 321 assertTrue("h invertible mod g", x.isONE() ); 322 323 } 324 325}