001 002/* 003 * $Id: ResidueTest.java 5864 2018-07-20 14:28:52Z kredel $ 004 */ 005 006package edu.jas.application; 007 008import java.util.ArrayList; 009import java.util.List; 010 011import junit.framework.Test; 012import junit.framework.TestCase; 013import junit.framework.TestSuite; 014 015// 016 017import edu.jas.arith.BigRational; 018 019//import edu.jas.structure.RingElem; 020 021import edu.jas.poly.GenPolynomial; 022import edu.jas.poly.GenPolynomialRing; 023 024 025/** 026 * Residue tests with JUnit. 027 * @author Heinz Kredel 028 */ 029 030public class ResidueTest extends TestCase { 031 032/** 033 * main. 034 */ 035 public static void main (String[] args) { 036 // 037 junit.textui.TestRunner.run( suite() ); 038 } 039 040/** 041 * Constructs a <CODE>ResidueTest</CODE> object. 042 * @param name String. 043 */ 044 public ResidueTest(String name) { 045 super(name); 046 } 047 048/** 049 * suite. 050 */ 051 public static Test suite() { 052 TestSuite suite= new TestSuite(ResidueTest.class); 053 return suite; 054 } 055 056 //private final static int bitlen = 100; 057 058 Ideal<BigRational> id; 059 ResidueRing<BigRational> fac; 060 GenPolynomialRing<BigRational> mfac; 061 List<GenPolynomial<BigRational>> F; 062 063 Residue< BigRational > a; 064 Residue< BigRational > b; 065 Residue< BigRational > c; 066 Residue< BigRational > d; 067 Residue< BigRational > e; 068 069 int rl = 3; 070 int kl = 3; 071 int ll = 7; 072 int el = 3; 073 float q = 0.4f; 074 int il = ( rl == 1 ? 1 : 2 ); 075 076 protected void setUp() { 077 a = b = c = d = e = null; 078 mfac = new GenPolynomialRing<BigRational>( new BigRational(1), rl ); 079 F = new ArrayList<GenPolynomial<BigRational>>( il ); 080 for ( int i = 0; i < il; i++ ) { 081 GenPolynomial<BigRational> mo = mfac.random(kl,ll,el,q); 082 while ( mo.isConstant() ) { 083 mo = mfac.random(kl,ll,el,q); 084 } 085 F.add( mo ); 086 } 087 id = new Ideal<BigRational>(mfac,F); 088 //System.out.println("id = " + id); 089 assert !id.isONE() : "id = " + id; 090 fac = new ResidueRing<BigRational>( id ); 091 //System.out.println("fac = " + fac); 092 F = null; 093 } 094 095 protected void tearDown() { 096 a = b = c = d = e = null; 097 fac = null; 098 id = null; 099 mfac = null; 100 } 101 102 103/** 104 * Test constructor and toString. 105 * 106 */ 107 public void testConstruction() { 108 c = fac.getONE(); 109 //System.out.println("c = " + c); 110 //System.out.println("c.val = " + c.val); 111 assertTrue("length( c ) = 1 ", c.val.length() == 1 || id.isONE()); 112 assertTrue("isZERO( c )", !c.isZERO() || id.isONE()); 113 assertTrue("isONE( c )", c.isONE() || id.isONE()); 114 115 d = fac.getZERO(); 116 //System.out.println("d = " + d); 117 //System.out.println("d.val = " + d.val); 118 assertTrue("length( d ) = 0", d.val.length() == 0); 119 assertTrue("isZERO( d )", d.isZERO() ); 120 assertTrue("isONE( d )", !d.isONE() ); 121 } 122 123 124/** 125 * Test random polynomial. 126 * 127 */ 128 public void testRandom() { 129 for (int i = 0; i < 7; i++) { 130 //a = fac.random(ll+i); 131 a = fac.random(kl*(i+1), ll+2*i, el+i, q ); 132 //System.out.println("a = " + a); 133 if ( a.isZERO() || a.isONE() ) { 134 continue; 135 } 136 assertTrue("length( a"+i+" ) <> 0", a.val.length() >= 0); 137 assertTrue(" not isZERO( a"+i+" )", !a.isZERO() ); 138 assertTrue(" not isONE( a"+i+" )", !a.isONE() ); 139 } 140 } 141 142 143/** 144 * Test addition. 145 * 146 */ 147 public void testAddition() { 148 149 a = fac.random(kl,ll,el,q); 150 b = fac.random(kl,ll,el,q); 151 152 c = a.sum(b); 153 d = c.subtract(b); 154 assertEquals("a+b-b = a",a,d); 155 156 c = a.sum(b); 157 d = b.sum(a); 158 assertEquals("a+b = b+a",c,d); 159 160 c = fac.random(kl,ll,el,q); 161 d = c.sum( a.sum(b) ); 162 e = c.sum( a ).sum(b); 163 assertEquals("c+(a+b) = (c+a)+b",d,e); 164 165 166 c = a.sum( fac.getZERO() ); 167 d = a.subtract( fac.getZERO() ); 168 assertEquals("a+0 = a-0",c,d); 169 170 c = fac.getZERO().sum( a ); 171 d = fac.getZERO().subtract( a.negate() ); 172 assertEquals("0+a = 0+(-a)",c,d); 173 174 } 175 176 177/** 178 * Test object multiplication. 179 * 180 */ 181 182 public void testMultiplication() { 183 184 a = fac.random(kl,ll,el,q); 185 if ( a.isZERO() ) { 186 return; 187 } 188 assertTrue("not isZERO( a )", !a.isZERO() ); 189 a = a.monic(); 190 191 b = fac.random(kl,ll,el,q); 192 if ( b.isZERO() ) { 193 return; 194 } 195 assertTrue("not isZERO( b )", !b.isZERO() ); 196 b = b.monic(); 197 198 c = b.multiply(a); 199 d = a.multiply(b); 200 assertTrue("not isZERO( c )", !c.isZERO() ); 201 assertTrue("not isZERO( d )", !d.isZERO() ); 202 203 //System.out.println("a = " + a); 204 //System.out.println("b = " + b); 205 e = d.subtract(c); 206 assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() ); 207 208 assertTrue("a*b = b*a", c.equals(d) ); 209 assertEquals("a*b = b*a",c,d); 210 211 d = c.remainder(a); 212 //System.out.println("c = " + c); 213 //System.out.println("d = " + d); 214 if ( d.isZERO() ) { 215 d = c.divide(a); 216 //System.out.println("c = " + c); 217 //System.out.println("d = " + d); 218 e = d.multiply(a); 219 //System.out.println("e = " + e); 220 assertEquals("((b*a)/a)*a = b*a",e,c); 221 } 222 223 c = fac.random(kl,ll,el,q); 224 //System.out.println("c = " + c); 225 d = a.multiply( b.multiply(c) ); 226 e = (a.multiply(b)).multiply(c); 227 228 //System.out.println("d = " + d); 229 //System.out.println("e = " + e); 230 231 //System.out.println("d-e = " + d.subtract(c) ); 232 233 assertEquals("a(bc) = (ab)c",d,e); 234 assertTrue("a(bc) = (ab)c", d.equals(e) ); 235 236 c = a.multiply( fac.getONE() ); 237 d = fac.getONE().multiply( a ); 238 assertEquals("a*1 = 1*a",c,d); 239 240 if ( a.isUnit() ) { 241 c = a.inverse(); 242 d = c.multiply(a); 243 //System.out.println("a = " + a); 244 //System.out.println("c = " + c); 245 //System.out.println("d = " + d); 246 assertTrue("a*1/a = 1",d.isONE()); 247 } 248 } 249 250}