001 /* 002 * $Id: ModGenPolynomialTest.java 1888 2008-07-12 13:37:34Z kredel $ 003 */ 004 005 package edu.jas.poly; 006 007 import junit.framework.Test; 008 import junit.framework.TestCase; 009 import junit.framework.TestSuite; 010 011 import edu.jas.poly.GenPolynomial; 012 import edu.jas.arith.ModInteger; 013 import edu.jas.arith.ModIntegerRing; 014 //import edu.jas.structure.RingElem; 015 016 017 /** 018 * ModInteger coefficients GenPolynomial tests with JUnit. 019 * @author Heinz Kredel. 020 */ 021 022 public class ModGenPolynomialTest extends TestCase { 023 024 /** 025 * main. 026 */ 027 public static void main (String[] args) { 028 junit.textui.TestRunner.run( suite() ); 029 } 030 031 /** 032 * Constructs a <CODE>ModGenPolynomialTest</CODE> object. 033 * @param name String. 034 */ 035 public ModGenPolynomialTest(String name) { 036 super(name); 037 } 038 039 /** 040 * suite. 041 */ 042 public static Test suite() { 043 TestSuite suite= new TestSuite(ModGenPolynomialTest.class); 044 return suite; 045 } 046 047 //private final static int bitlen = 100; 048 049 GenPolynomialRing<ModInteger> fac; 050 051 GenPolynomial<ModInteger> a; 052 GenPolynomial<ModInteger> b; 053 GenPolynomial<ModInteger> c; 054 GenPolynomial<ModInteger> d; 055 GenPolynomial<ModInteger> e; 056 057 int ml = 19; // modul 058 int rl = 7; 059 int kl = 10; 060 int ll = 10; 061 int el = 5; 062 float q = 0.5f; 063 064 protected void setUp() { 065 a = b = c = d = e = null; 066 fac = new GenPolynomialRing<ModInteger>(new ModIntegerRing(ml),rl); 067 } 068 069 protected void tearDown() { 070 a = b = c = d = e = null; 071 fac = null; 072 } 073 074 075 /** 076 * Test constructor and toString. 077 * 078 */ 079 public void testConstruction() { 080 c = fac.getONE(); 081 assertTrue("length( c ) = 1", c.length() == 1); 082 assertTrue("isZERO( c )", !c.isZERO() ); 083 assertTrue("isONE( c )", c.isONE() ); 084 085 d = fac.getZERO(); 086 assertTrue("length( d ) = 0", d.length() == 0); 087 assertTrue("isZERO( d )", d.isZERO() ); 088 assertTrue("isONE( d )", !d.isONE() ); 089 } 090 091 092 /** 093 * Test random polynomial. 094 * 095 */ 096 public void testRandom() { 097 for (int i = 0; i < 7; i++) { 098 a = fac.random(ll); 099 // fac.random(rl+i, kl*(i+1), ll+2*i, el+i, q ); 100 assertTrue("length( a"+i+" ) <> 0", a.length() >= 0); 101 assertTrue(" not isZERO( a"+i+" )", !a.isZERO() ); 102 assertTrue(" not isONE( a"+i+" )", !a.isONE() ); 103 } 104 } 105 106 107 /** 108 * Test addition. 109 * 110 */ 111 public void testAddition() { 112 113 a = fac.random(ll); 114 b = fac.random(ll); 115 116 c = a.sum(b); 117 d = c.subtract(b); 118 assertEquals("a+b-b = a",a,d); 119 120 c = fac.random(ll); 121 122 ExpVector u = ExpVector.EVRAND(rl,el,q); 123 ModInteger x = c.leadingBaseCoefficient().ring.random(kl); 124 125 b = new GenPolynomial<ModInteger>(fac,x, u); 126 c = a.sum(b); 127 d = a.sum(x,u); 128 assertEquals("a+p(x,u) = a+(x,u)",c,d); 129 130 c = a.subtract(b); 131 d = a.subtract(x,u); 132 assertEquals("a-p(x,u) = a-(x,u)",c,d); 133 134 a = new GenPolynomial<ModInteger>(fac); 135 b = new GenPolynomial<ModInteger>(fac,x, u); 136 c = b.sum(a); 137 d = a.sum(x,u); 138 assertEquals("a+p(x,u) = a+(x,u)",c,d); 139 140 c = a.subtract(b); 141 d = a.subtract(x,u); 142 assertEquals("a-p(x,u) = a-(x,u)",c,d); 143 } 144 145 146 /** 147 * Test object multiplication. 148 * 149 */ 150 151 public void testMultiplication() { 152 153 a = fac.random(ll); 154 assertTrue("not isZERO( a )", !a.isZERO() ); 155 156 b = fac.random(ll); 157 assertTrue("not isZERO( b )", !b.isZERO() ); 158 159 c = b.multiply(a); 160 d = a.multiply(b); 161 assertTrue("not isZERO( c )", !c.isZERO() ); 162 assertTrue("not isZERO( d )", !d.isZERO() ); 163 164 //System.out.println("a = " + a); 165 //System.out.println("b = " + b); 166 e = d.subtract(c); 167 assertTrue("isZERO( a*b-b*a ) " + e, e.isZERO() ); 168 169 assertTrue("a*b = b*a", c.equals(d) ); 170 assertEquals("a*b = b*a",c,d); 171 172 c = fac.random(ll); 173 //System.out.println("c = " + c); 174 d = a.multiply( b.multiply(c) ); 175 e = (a.multiply(b)).multiply(c); 176 177 //System.out.println("d = " + d); 178 //System.out.println("e = " + e); 179 180 //System.out.println("d-e = " + d.subtract(c) ); 181 182 assertEquals("a(bc) = (ab)c",d,e); 183 assertTrue("a(bc) = (ab)c", d.equals(e) ); 184 185 ModInteger x = a.leadingBaseCoefficient().inverse(); 186 c = a.monic(); 187 d = a.multiply(x); 188 assertEquals("a.monic() = a(1/ldcf(a))",c,d); 189 190 ModInteger y = b.leadingBaseCoefficient().inverse(); 191 c = b.monic(); 192 d = b.multiply(y); 193 assertEquals("b.monic() = b(1/ldcf(b))",c,d); 194 195 e = new GenPolynomial<ModInteger>(fac,y); 196 d = b.multiply(e); 197 assertEquals("b.monic() = b(1/ldcf(b))",c,d); 198 199 d = e.multiply(b); 200 assertEquals("b.monic() = (1/ldcf(b) (0))*b",c,d); 201 } 202 203 204 /** 205 * Test distributive law. 206 * 207 */ 208 public void testDistributive() { 209 a = fac.random(kl,ll,el,q); 210 b = fac.random(kl,ll,el,q); 211 c = fac.random(kl,ll,el,q); 212 213 d = a.multiply( b.sum(c) ); 214 e = a.multiply( b ).sum( a.multiply(c) ); 215 216 assertEquals("a(b+c) = ab+ac",d,e); 217 } 218 219 }