001/* 002 * $Id: ComplexAlgebraicTest.java 5863 2018-07-20 11:13:34Z kredel $ 003 */ 004 005package edu.jas.root; 006 007 008import junit.framework.Test; 009import junit.framework.TestCase; 010import junit.framework.TestSuite; 011 012 013import edu.jas.arith.BigRational; 014import edu.jas.poly.Complex; 015import edu.jas.poly.ComplexRing; 016import edu.jas.poly.GenPolynomial; 017import edu.jas.poly.GenPolynomialRing; 018import edu.jas.structure.NotInvertibleException; 019 020 021/** 022 * ComplexAlgebraicNumber Test using JUnit. 023 * @author Heinz Kredel 024 */ 025 026public class ComplexAlgebraicTest extends TestCase { 027 028 029 /** 030 * main. 031 */ 032 public static void main(String[] args) { 033 junit.textui.TestRunner.run(suite()); 034 } 035 036 037 /** 038 * Constructs a <CODE>ComplexAlgebraicTest</CODE> object. 039 * @param name String. 040 */ 041 public ComplexAlgebraicTest(String name) { 042 super(name); 043 } 044 045 046 /** 047 * suite. 048 */ 049 public static Test suite() { 050 TestSuite suite = new TestSuite(ComplexAlgebraicTest.class); 051 return suite; 052 } 053 054 055 //private final static int bitlen = 100; 056 057 ComplexAlgebraicRing<BigRational> fac; 058 059 060 GenPolynomialRing<Complex<BigRational>> mfac; 061 062 063 ComplexAlgebraicNumber<BigRational> a; 064 065 066 ComplexAlgebraicNumber<BigRational> b; 067 068 069 ComplexAlgebraicNumber<BigRational> c; 070 071 072 ComplexAlgebraicNumber<BigRational> d; 073 074 075 ComplexAlgebraicNumber<BigRational> e; 076 077 078 ComplexAlgebraicNumber<BigRational> alpha; 079 080 081 int rl = 1; 082 083 084 int kl = 10; 085 086 087 int ll = 10; 088 089 090 int el = ll; 091 092 093 float q = 0.5f; 094 095 096 @Override 097 protected void setUp() { 098 a = b = c = d = e = null; 099 ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(new BigRational(1)); 100 Complex<BigRational> im = cfac.getIMAG(); 101 BigRational rfac = new BigRational(); 102 BigRational two = new BigRational(2); 103 Complex<BigRational> nw = new Complex<BigRational>(cfac, rfac.getZERO(), two); 104 Complex<BigRational> sw = new Complex<BigRational>(cfac, rfac.getZERO(), rfac.getZERO()); 105 Complex<BigRational> se = new Complex<BigRational>(cfac, two, rfac.getZERO()); 106 Complex<BigRational> ne = new Complex<BigRational>(cfac, two, two); 107 Rectangle<BigRational> positiv = new Rectangle<BigRational>(nw, sw, se, ne); 108 //System.out.println("postiv = " + positiv); 109 String[] vars = new String[] { "alpha" }; 110 mfac = new GenPolynomialRing<Complex<BigRational>>(cfac, rl, vars); 111 Complex<BigRational> r1 = cfac.fromInteger(1).sum(im); 112 Complex<BigRational> r2 = r1.conjugate(); 113 GenPolynomial<Complex<BigRational>> mo = mfac.univariate(0, 1); 114 mo = mo.subtract(r1).multiply(mo.subtract(r2)); // (x - (1+i))((x - (1-i))) 115 fac = new ComplexAlgebraicRing<BigRational>(mo, positiv); 116 alpha = fac.getGenerator(); 117 //System.out.println("fac = " + fac); 118 } 119 120 121 @Override 122 protected void tearDown() { 123 a = b = c = d = e = null; 124 fac = null; 125 alpha = null; 126 } 127 128 129 /** 130 * Test constructor and toString. 131 * 132 */ 133 public void testConstruction() { 134 c = fac.getONE(); 135 //System.out.println("c = " + c); 136 //System.out.println("c.getVal() = " + c.getVal()); 137 assertTrue("length( c ) = 1", c.number.getVal().length() == 1); 138 assertTrue("isZERO( c )", !c.isZERO()); 139 assertTrue("isONE( c )", c.isONE()); 140 141 d = fac.getZERO(); 142 //System.out.println("d = " + d); 143 //System.out.println("d.getVal() = " + d.getVal()); 144 assertTrue("length( d ) = 0", d.number.getVal().length() == 0); 145 assertTrue("isZERO( d )", d.isZERO()); 146 assertTrue("isONE( d )", !d.isONE()); 147 } 148 149 150 /** 151 * Test random polynomial. 152 * 153 */ 154 public void testRandom() { 155 for (int i = 0; i < 7; i++) { 156 a = fac.random(el); 157 //System.out.println("a = " + a); 158 if (a.isZERO() || a.isONE()) { 159 continue; 160 } 161 // fac.random(rl+i, kl*(i+1), ll+2*i, el+i, q ); 162 assertTrue("length( a" + i + " ) <> 0", a.number.getVal().length() >= 0); 163 assertTrue(" not isZERO( a" + i + " )", !a.isZERO()); 164 assertTrue(" not isONE( a" + i + " )", !a.isONE()); 165 } 166 } 167 168 169 /** 170 * Test addition. 171 * 172 */ 173 public void testAddition() { 174 a = fac.random(ll); 175 b = fac.random(ll); 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(ll); 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 * Test object multiplication. 203 * 204 */ 205 public void testMultiplication() { 206 a = fac.random(ll); 207 assertTrue("not isZERO( a )", !a.isZERO()); 208 209 b = fac.random(ll); 210 assertTrue("not isZERO( b )", !b.isZERO()); 211 212 c = b.multiply(a); 213 d = a.multiply(b); 214 assertTrue("not isZERO( c )", !c.isZERO()); 215 assertTrue("not isZERO( d )", !d.isZERO()); 216 217 //System.out.println("a = " + a); 218 //System.out.println("b = " + b); 219 e = d.subtract(c); 220 assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO()); 221 222 assertTrue("a*b = b*a", c.equals(d)); 223 assertEquals("a*b = b*a", c, d); 224 225 c = fac.random(ll); 226 //System.out.println("c = " + c); 227 d = a.multiply(b.multiply(c)); 228 e = (a.multiply(b)).multiply(c); 229 230 //System.out.println("d = " + d); 231 //System.out.println("e = " + e); 232 233 //System.out.println("d-e = " + d.subtract(c) ); 234 235 assertEquals("a(bc) = (ab)c", d, e); 236 assertTrue("a(bc) = (ab)c", d.equals(e)); 237 238 c = a.multiply(fac.getONE()); 239 d = fac.getONE().multiply(a); 240 assertEquals("a*1 = 1*a", c, d); 241 242 243 c = a.inverse(); 244 d = c.multiply(a); 245 //System.out.println("a = " + a); 246 //System.out.println("c = " + c); 247 //System.out.println("d = " + d); 248 assertEquals("a*1/a = 1", fac.getONE(), d); 249 250 try { 251 a = fac.getZERO().inverse(); 252 } catch (NotInvertibleException expected) { 253 return; 254 } 255 fail("0 invertible"); 256 } 257 258 259 /** 260 * Test distributive law. 261 * 262 */ 263 public void testDistributive() { 264 a = fac.random(ll); 265 b = fac.random(ll); 266 c = fac.random(ll); 267 268 d = a.multiply(b.sum(c)); 269 e = a.multiply(b).sum(a.multiply(c)); 270 271 assertEquals("a(b+c) = ab+ac", d, e); 272 } 273 274 275 /** 276 * Test compareTo of complex algebraic numbers. 277 * 278 */ 279 public void testCompare() { 280 a = fac.random(ll).abs(); 281 b = a.sum(fac.getONE()); 282 c = b.sum(fac.getONE()); 283 284 int ab = a.compareTo(b); 285 int bc = b.compareTo(c); 286 int ac = a.compareTo(c); 287 288 assertTrue("a < a+1 ", ab < 0); 289 assertTrue("a+1 < a+2 ", bc < 0); 290 assertTrue("a < a+2 ", ac < 0); 291 292 a = a.negate(); 293 b = a.sum(fac.getONE()); 294 c = b.sum(fac.getONE()); 295 296 ab = a.compareTo(b); 297 bc = b.compareTo(c); 298 ac = a.compareTo(c); 299 300 assertTrue("a < a+1 ", ab < 0); 301 assertTrue("a+1 < a+2 ", bc < 0); 302 assertTrue("a < a+2 ", ac < 0); 303 } 304 305}