001 002/* 003 * $Id: ResidueTest.java 5864 2018-07-20 14:28:52Z kredel $ 004 */ 005 006package edu.jas.poly; 007 008//import java.util.ArrayList; 009//import java.util.List; 010 011import junit.framework.Test; 012import junit.framework.TestCase; 013import junit.framework.TestSuite; 014 015 016import edu.jas.arith.BigRational; 017import edu.jas.arith.BigInteger; 018 019//import edu.jas.structure.RingElem; 020 021 022 023/** 024 * Residue test with JUnit. 025 * @author Heinz Kredel 026 */ 027 028public class ResidueTest extends TestCase { 029 030/** 031 * main. 032 */ 033 public static void main (String[] args) { 034 junit.textui.TestRunner.run( suite() ); 035 } 036 037/** 038 * Constructs a <CODE>ResidueTest</CODE> object. 039 * @param name String. 040 */ 041 public ResidueTest(String name) { 042 super(name); 043 } 044 045/** 046 * suite. 047 */ 048 public static Test suite() { 049 TestSuite suite= new TestSuite(ResidueTest.class); 050 return suite; 051 } 052 053 ResidueRing<BigInteger> fac; 054 GenPolynomialRing<BigRational> pfac; 055 ResidueRing< GenPolynomial<BigRational> > mfac; 056 057 Residue< BigInteger > a; 058 Residue< BigInteger > b; 059 Residue< BigInteger > c; 060 Residue< BigInteger > d; 061 Residue< BigInteger > e; 062 063 Residue< GenPolynomial<BigRational> > ap; 064 Residue< GenPolynomial<BigRational> > bp; 065 Residue< GenPolynomial<BigRational> > cp; 066 Residue< GenPolynomial<BigRational> > dp; 067 Residue< GenPolynomial<BigRational> > ep; 068 069 070 int rl = 1; 071 int kl = 13; 072 int ll = 7; 073 int el = 3; 074 float q = 0.4f; 075 int il = 2; 076 long p = 1152921504606846883L; // 2^60-93; 077 078 @Override 079 protected void setUp() { 080 a = b = c = d = e = null; 081 ap = bp = cp = dp = ep = null; 082 BigInteger cfac = new BigInteger(1); 083 fac = new ResidueRing<BigInteger>( cfac, new BigInteger( p ) ); 084 pfac = new GenPolynomialRing<BigRational>( new BigRational(1), 1 ); 085 GenPolynomial<BigRational> mo = pfac.random(kl,ll,el,q); 086 while ( mo.isConstant() ) { 087 mo = pfac.random(kl,ll,el,q); 088 } 089 mfac = new ResidueRing<GenPolynomial<BigRational>>( pfac, mo ); 090 } 091 092 @Override 093 protected void tearDown() { 094 a = b = c = d = e = null; 095 ap = bp = cp = dp = ep = null; 096 fac = null; 097 pfac = null; 098 mfac = null; 099 } 100 101 102/** 103 * Test constructor for integer. 104 * 105 */ 106 public void testIntConstruction() { 107 c = fac.getONE(); 108 //System.out.println("c = " + c); 109 assertTrue("isZERO( c )", !c.isZERO() ); 110 assertTrue("isONE( c )", c.isONE() ); 111 112 d = fac.getZERO(); 113 //System.out.println("d = " + d); 114 assertTrue("isZERO( d )", d.isZERO() ); 115 assertTrue("isONE( d )", !d.isONE() ); 116 } 117 118 119/** 120 * Test constructor for polynomial. 121 * 122 */ 123 public void testPolyConstruction() { 124 cp = mfac.getONE(); 125 assertTrue("isZERO( cp )", !cp.isZERO() ); 126 assertTrue("isONE( cp )", cp.isONE() ); 127 128 dp = mfac.getZERO(); 129 assertTrue("isZERO( dp )", dp.isZERO() ); 130 assertTrue("isONE( dp )", !dp.isONE() ); 131 } 132 133 134/** 135 * Test random integer. 136 * 137 */ 138 public void testIntRandom() { 139 for (int i = 0; i < 7; i++) { 140 a = fac.random(kl*(i+1)); 141 if ( a.isZERO() ) { 142 continue; 143 } 144 //a = fac.random(kl*(i+1), ll+2*i, el+i, q ); 145 //System.out.println("a = " + a); 146 assertTrue(" not isZERO( a"+i+" )", !a.isZERO() ); 147 assertTrue(" not isONE( a"+i+" )", !a.isONE() ); 148 } 149 } 150 151 152/** 153 * Test random polynomial. 154 * 155 */ 156 public void testPolyRandom() { 157 for (int i = 0; i < 7; i++) { 158 ap = mfac.random(kl+i); 159 if ( ap.isZERO() ) { 160 continue; 161 } 162 assertTrue(" not isZERO( ap"+i+" )", !ap.isZERO() ); 163 assertTrue(" not isONE( ap"+i+" )", !ap.isONE() ); 164 } 165 } 166 167 168/** 169 * Test integer addition. 170 * 171 */ 172 public void testIntAddition() { 173 174 a = fac.random(kl); 175 b = fac.random(kl); 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); 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 polynomial addition. 203 * 204 */ 205 public void testPolyAddition() { 206 207 ap = mfac.random(kl); 208 bp = mfac.random(kl); 209 //System.out.println("a = " + a); 210 //System.out.println("b = " + b); 211 212 cp = ap.sum(bp); 213 dp = cp.subtract(bp); 214 assertEquals("a+b-b = a",ap,dp); 215 216 cp = ap.sum(bp); 217 dp = bp.sum(ap); 218 //System.out.println("c = " + c); 219 //System.out.println("d = " + d); 220 221 assertEquals("a+b = b+a",cp,dp); 222 223 cp = mfac.random(kl); 224 dp = cp.sum( ap.sum(bp) ); 225 ep = cp.sum( ap ).sum(bp); 226 assertEquals("c+(a+b) = (c+a)+b",dp,ep); 227 228 229 cp = ap.sum( mfac.getZERO() ); 230 dp = ap.subtract( mfac.getZERO() ); 231 assertEquals("a+0 = a-0",cp,dp); 232 233 cp = mfac.getZERO().sum( ap ); 234 dp = mfac.getZERO().subtract( ap.negate() ); 235 assertEquals("0+a = 0+(-a)",cp,dp); 236 } 237 238 239/** 240 * Test integer multiplication. 241 * 242 */ 243 244 public void testIntMultiplication() { 245 246 a = fac.random(kl); 247 if ( a.isZERO() ) { 248 return; 249 } 250 assertTrue("not isZERO( a )", !a.isZERO() ); 251 252 b = fac.random(kl); 253 if ( b.isZERO() ) { 254 return; 255 } 256 assertTrue("not isZERO( b )", !b.isZERO() ); 257 258 c = b.multiply(a); 259 d = a.multiply(b); 260 assertTrue("not isZERO( c )", !c.isZERO() ); 261 assertTrue("not isZERO( d )", !d.isZERO() ); 262 263 //System.out.println("a = " + a); 264 //System.out.println("b = " + b); 265 e = d.subtract(c); 266 assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() ); 267 268 assertTrue("a*b = b*a", c.equals(d) ); 269 assertEquals("a*b = b*a",c,d); 270 271 c = fac.random(kl); 272 //System.out.println("c = " + c); 273 d = a.multiply( b.multiply(c) ); 274 e = (a.multiply(b)).multiply(c); 275 276 //System.out.println("d = " + d); 277 //System.out.println("e = " + e); 278 279 //System.out.println("d-e = " + d.subtract(c) ); 280 281 assertEquals("a(bc) = (ab)c",d,e); 282 assertTrue("a(bc) = (ab)c", d.equals(e) ); 283 284 c = a.multiply( fac.getONE() ); 285 d = fac.getONE().multiply( a ); 286 assertEquals("a*1 = 1*a",c,d); 287 288 if ( a.isUnit() ) { 289 c = a.inverse(); 290 d = c.multiply(a); 291 //System.out.println("a = " + a); 292 //System.out.println("c = " + c); 293 //System.out.println("d = " + d); 294 assertTrue("a*1/a = 1",d.isONE()); 295 } 296 } 297 298 299/** 300 * Test polynomial multiplication. 301 * 302 */ 303 public void testPolyMultiplication() { 304 305 ap = mfac.random(kl); 306 if ( ap.isZERO() ) { 307 return; 308 } 309 assertTrue("not isZERO( a )", !ap.isZERO() ); 310 311 bp = mfac.random(kl); 312 if ( bp.isZERO() ) { 313 return; 314 } 315 assertTrue("not isZERO( b )", !bp.isZERO() ); 316 317 cp = bp.multiply(ap); 318 dp = ap.multiply(bp); 319 assertTrue("not isZERO( c )", !cp.isZERO() ); 320 assertTrue("not isZERO( d )", !dp.isZERO() ); 321 322 //System.out.println("a = " + a); 323 //System.out.println("b = " + b); 324 ep = dp.subtract(cp); 325 assertTrue("isZERO( a*b-b*a ) " + ep, ep.isZERO() ); 326 327 assertTrue("a*b = b*a", cp.equals(dp) ); 328 assertEquals("a*b = b*a",cp,dp); 329 330 cp = mfac.random(kl); 331 //System.out.println("c = " + c); 332 dp = ap.multiply( bp.multiply(cp) ); 333 ep = (ap.multiply(bp)).multiply(cp); 334 335 //System.out.println("d = " + d); 336 //System.out.println("e = " + e); 337 338 //System.out.println("d-e = " + d.subtract(c) ); 339 340 assertEquals("a(bc) = (ab)c",dp,ep); 341 assertTrue("a(bc) = (ab)c", dp.equals(ep) ); 342 343 cp = ap.multiply( mfac.getONE() ); 344 dp = mfac.getONE().multiply( ap ); 345 assertEquals("a*1 = 1*a",cp,dp); 346 347 if ( ap.isUnit() ) { 348 cp = ap.inverse(); 349 dp = cp.multiply(ap); 350 //System.out.println("a = " + a); 351 //System.out.println("c = " + c); 352 //System.out.println("d = " + d); 353 assertTrue("a*1/a = 1",dp.isONE()); 354 } 355 } 356 357 358}