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