001/* 002 * $Id: FactorComplexTest.java 6011 2020-04-01 10:40:41Z kredel $ 003 */ 004 005package edu.jas.ufd; 006 007 008import java.util.SortedMap; 009 010import edu.jas.arith.BigRational; 011import edu.jas.kern.ComputerThreads; 012import edu.jas.poly.Complex; 013import edu.jas.poly.ComplexRing; 014import edu.jas.poly.GenPolynomial; 015import edu.jas.poly.GenPolynomialRing; 016import edu.jas.poly.TermOrder; 017import edu.jas.poly.TermOrderByName; 018 019import junit.framework.Test; 020import junit.framework.TestCase; 021import junit.framework.TestSuite; 022 023 024/** 025 * Factor complex via algebraic tests with JUnit. 026 * @author Heinz Kredel 027 */ 028public class FactorComplexTest extends TestCase { 029 030 031 /** 032 * main. 033 */ 034 public static void main(String[] args) { 035 junit.textui.TestRunner.run(suite()); 036 } 037 038 039 /** 040 * Constructs a <CODE>FactorComplexTest</CODE> object. 041 * @param name String. 042 */ 043 public FactorComplexTest(String name) { 044 super(name); 045 } 046 047 048 /** 049 */ 050 public static Test suite() { 051 TestSuite suite = new TestSuite(FactorComplexTest.class); 052 return suite; 053 } 054 055 056 int rl = 3; 057 058 059 int kl = 5; 060 061 062 int ll = 5; 063 064 065 int el = 3; 066 067 068 float q = 0.3f; 069 070 071 @Override 072 protected void setUp() { 073 } 074 075 076 @Override 077 protected void tearDown() { 078 ComputerThreads.terminate(); 079 } 080 081 082 /** 083 * Test dummy for empty test cases Junit. 084 */ 085 public void xtestDummy() { 086 } 087 088 089 /** 090 * Test complex via algebraic factorization. 091 */ 092 public void testComplexFactorization() { 093 TermOrder to = new TermOrder(TermOrder.INVLEX); 094 BigRational rfac = new BigRational(1); 095 ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(rfac); 096 GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac, 1, 097 to); 098 //System.out.println("cfac = " + cfac); 099 //System.out.println("cpfac = " + cpfac); 100 101 FactorComplex<BigRational> fac = new FactorComplex<BigRational>(cfac); 102 103 for (int i = 1; i < 3; i++) { 104 int facs = 0; 105 GenPolynomial<Complex<BigRational>> a; 106 GenPolynomial<Complex<BigRational>> c = cpfac.random(2, ll + i, el + i, q); 107 //a = a.monic(); 108 GenPolynomial<Complex<BigRational>> b = cpfac.random(2, ll + i, el + i, q); 109 if (b.degree() == 0) { 110 b = b.multiply(cpfac.univariate(0)); 111 } 112 if (c.degree() > 0) { 113 facs++; 114 } 115 b = b.multiply(b); 116 if (b.degree() > 0) { 117 facs++; 118 } 119 a = c.multiply(b); 120 //a = a.monic(); 121 //System.out.println("\na = " + a); 122 //System.out.println("b = " + b.monic()); 123 //System.out.println("c = " + c.monic()); 124 125 SortedMap<GenPolynomial<Complex<BigRational>>, Long> sm = fac.baseFactors(a); 126 //System.out.println("\na = " + a); 127 //System.out.println("sm = " + sm); 128 if (sm.size() >= facs) { 129 assertTrue("#facs < " + facs, sm.size() >= facs); 130 } else { 131 System.out.println("sm.size() < facs = " + facs); 132 } 133 boolean t = fac.isFactorization(a, sm); 134 //System.out.println("t = " + t); 135 assertTrue("prod(factor(a)) = a", t); 136 } 137 } 138 139 140 /** 141 * Test complex absolute via algebraic factorization. 142 */ 143 public void testComplexAbsoluteFactorization() { 144 TermOrder to = new TermOrder(TermOrder.INVLEX); 145 BigRational rfac = new BigRational(1); 146 ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(rfac); 147 GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac, 1, 148 to); 149 //System.out.println("cfac = " + cfac); 150 //System.out.println("cpfac = " + cpfac); 151 152 FactorComplex<BigRational> fac = new FactorComplex<BigRational>(cfac); 153 154 for (int i = 1; i < 2; i++) { 155 int facs = 0; 156 GenPolynomial<Complex<BigRational>> a; 157 GenPolynomial<Complex<BigRational>> c = cpfac.random(2, ll, el, q); 158 //a = a.monic(); 159 GenPolynomial<Complex<BigRational>> b = cpfac.random(2, ll, el, q); 160 if (b.degree() == 0) { 161 b = b.multiply(cpfac.univariate(0)); 162 } 163 if (c.degree() > 0) { 164 facs++; 165 } 166 b = b.multiply(b); 167 if (b.degree() > 0) { 168 facs++; 169 } 170 a = c.multiply(b); 171 //a = a.monic(); 172 //System.out.println("\na = " + a); 173 //System.out.println("b = " + b.monic()); 174 //System.out.println("c = " + c.monic()); 175 176 FactorsMap<Complex<BigRational>> sm = fac.baseFactorsAbsolute(a); 177 //System.out.println("\na = " + a); 178 //System.out.println("sm = " + sm); 179 boolean t = fac.isAbsoluteFactorization(sm); 180 //System.out.println("t = " + t); 181 assertTrue("prod(factor(a)) = a", t); 182 assertTrue("facs <= #sm", facs <= sm.length()); 183 } 184 } 185 186 187 /** 188 * Test bivariate complex via algebraic factorization. 189 */ 190 public void testBivariateComplexFactorization() { 191 TermOrder to = new TermOrder(TermOrder.INVLEX); 192 BigRational rfac = new BigRational(1); 193 ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(rfac); 194 GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac, 2, 195 to); 196 //System.out.println("cfac = " + cfac); 197 //System.out.println("cpfac = " + cpfac); 198 199 FactorComplex<BigRational> fac = new FactorComplex<BigRational>(cfac); 200 201 for (int i = 1; i < 2; i++) { 202 int facs = 0; 203 GenPolynomial<Complex<BigRational>> a; 204 GenPolynomial<Complex<BigRational>> c = cpfac.random(2, ll + i, el, q); 205 //a = a.monic(); 206 GenPolynomial<Complex<BigRational>> b = cpfac.random(2, ll + i, el, q); 207 if (b.degree() == 0) { 208 b = b.multiply(cpfac.univariate(0)); 209 } 210 if (c.degree() > 0) { 211 facs++; 212 } 213 if (b.degree() > 0) { 214 facs++; 215 } 216 a = c.multiply(b); 217 //a = a.monic(); 218 //System.out.println("\na = " + a); 219 //System.out.println("b = " + b.monic()); 220 //System.out.println("c = " + c.monic()); 221 222 SortedMap<GenPolynomial<Complex<BigRational>>, Long> sm = fac.factors(a); 223 //System.out.println("\na = " + a); 224 //System.out.println("sm = " + sm); 225 if (sm.size() >= facs) { 226 assertTrue("#facs < " + facs, sm.size() >= facs); 227 } else { 228 System.out.println("sm.size() < facs = " + facs); 229 } 230 boolean t = fac.isFactorization(a, sm); 231 //System.out.println("t = " + t); 232 assertTrue("prod(factor(a)) = a", t); 233 } 234 } 235 236 237 /** 238 * Test bivariate complex factorization. Example from issue 10: 239 * https://github.com/kredel/java-algebra-system/issues/10 240 */ 241 public void testComplexFactor() { 242 ComplexRing<BigRational> cfac = new ComplexRing<BigRational>(BigRational.ZERO); 243 GenPolynomialRing<Complex<BigRational>> cpfac = new GenPolynomialRing<Complex<BigRational>>(cfac, 244 new String[] { "x1", "x0" }, TermOrderByName.INVLEX); 245 // GenPolynomial<Complex<BigRational>> a = cpfac.parse("x1^2 + x0^2") ; 246 // GenPolynomial<Complex<BigRational>> a = cpfac.parse("x1^4 + x0^4") ; 247 // GenPolynomial<Complex<BigRational>> a = cpfac.parse("x1^8 + x0^8") ; 248 GenPolynomial<Complex<BigRational>> a = cpfac.parse("x1^12 - x0^12"); 249 FactorComplex<BigRational> factorAbstract = new FactorComplex<BigRational>(cfac); 250 //System.out.println("factorAbstract = " + factorAbstract); 251 //System.out.println("factorFac = " + FactorFactory.getImplementation(cfac)); 252 SortedMap<GenPolynomial<Complex<BigRational>>, Long> map = factorAbstract.factors(a); 253 254 for (SortedMap.Entry<GenPolynomial<Complex<BigRational>>, Long> entry : map.entrySet()) { 255 if (entry.getKey().isONE() && entry.getValue().equals(1L)) { 256 continue; 257 } 258 assertTrue("degree <= 2 ", entry.getKey().degree() <= 2); 259 // System.out.print(" ( " + entry.getKey().toScript() + " )"); 260 // if (!entry.getValue().equals(1L)) { 261 // System.out.print(" ^ " + entry.getValue()); 262 // } 263 // System.out.println(); 264 } 265 boolean t = factorAbstract.isFactorization(a, map); 266 //System.out.println("t = " + t); 267 assertTrue("prod(factor(a)) = a", t); 268 } 269 270}