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