001/* 002 * $Id: ElementaryIntegrationLazard.java 5850 2018-06-24 15:39:36Z elbarbary $ 003 */ 004 005package edu.jas.integrate; 006 007 008import java.util.ArrayList; 009import java.util.List; 010import java.util.Map.Entry; 011import java.util.SortedMap; 012 013import org.apache.log4j.Logger; 014 015import edu.jas.poly.AlgebraicNumber; 016import edu.jas.poly.AlgebraicNumberRing; 017import edu.jas.poly.GenPolynomial; 018import edu.jas.poly.GenPolynomialRing; 019import edu.jas.poly.PolyUtil; 020import edu.jas.structure.GcdRingElem; 021import edu.jas.structure.RingFactory; 022import edu.jas.ufd.GCDFactory; 023import edu.jas.ufd.GreatestCommonDivisorAbstract; 024import edu.jas.ufd.GreatestCommonDivisorSubres; 025import edu.jas.ufd.PolyUfdUtil; 026 027 028/** 029 * Method related to elementary integration. Lazard-Rioboo-Trager integration of 030 * the logarithmic part. 031 * 032 * @author Youssef Elbarbary 033 * @param <C> coefficient type 034 */ 035 036public class ElementaryIntegrationLazard<C extends GcdRingElem<C>> extends ElementaryIntegration<C> { 037 038 039 private static final Logger logger = Logger.getLogger(ElementaryIntegrationLazard.class); 040 041 042 /** 043 * Constructor. 044 */ 045 public ElementaryIntegrationLazard(RingFactory<C> br) { 046 super(br); 047 } 048 049 050 /** 051 * Univariate GenPolynomial integration of the logaritmic part, Lazard - 052 * Rioboo - Trager 053 * 054 * @param A univariate GenPolynomial, deg(A) < deg(P). 055 * @param P univariate irreducible GenPolynomial. // gcd(A,P) == 1 automatic 056 * @return logarithmic part container. 057 */ 058 @Override 059 public LogIntegral<C> integrateLogPart(GenPolynomial<C> A, GenPolynomial<C> P) { 060 if (P == null || P.isZERO()) { 061 throw new IllegalArgumentException("P == null or P == 0"); 062 } 063 // System.out.println("\nP_base_algeb_part = " + P); 064 GenPolynomialRing<C> pfac = P.ring; // K[x] 065 if (pfac.nvar > 1) { 066 throw new IllegalArgumentException("only for univariate polynomials " + pfac); 067 } 068 if (!pfac.coFac.isField()) { 069 throw new IllegalArgumentException("only for field coefficients " + pfac); 070 } 071 List<C> cfactors = new ArrayList<C>(); 072 List<GenPolynomial<C>> cdenom = new ArrayList<GenPolynomial<C>>(); 073 List<AlgebraicNumber<C>> afactors = new ArrayList<AlgebraicNumber<C>>(); 074 List<GenPolynomial<AlgebraicNumber<C>>> adenom = new ArrayList<GenPolynomial<AlgebraicNumber<C>>>(); 075 076 // P linear 077 if (P.degree(0) <= 1) { 078 cfactors.add(A.leadingBaseCoefficient()); 079 cdenom.add(P); 080 return new LogIntegral<C>(A, P, cfactors, cdenom, afactors, adenom); 081 } 082 083 // deriviative 084 GenPolynomial<C> Pp = PolyUtil.<C> baseDeriviative(P); 085 // no: Pp = Pp.monic(); 086 // System.out.println("\nP = " + P); 087 088 // Q[t] 089 String[] vars = new String[] { "t" }; 090 GenPolynomialRing<C> cfac = new GenPolynomialRing<C>(pfac.coFac, 1, pfac.tord, vars); 091 GenPolynomial<C> t = cfac.univariate(0); 092 // System.out.println("t = " + t); 093 094 // Q[x][t] 095 GenPolynomialRing<GenPolynomial<C>> rfac = new GenPolynomialRing<GenPolynomial<C>>(pfac, cfac); // sic 096 // System.out.println("rfac = " + rfac.toScript()); 097 098 // transform polynomials to bi-variate polynomial 099 GenPolynomial<GenPolynomial<C>> Ac = PolyUfdUtil.<C> introduceLowerVariable(rfac, A); 100 GenPolynomial<GenPolynomial<C>> Pc = PolyUfdUtil.<C> introduceLowerVariable(rfac, P); 101 GenPolynomial<GenPolynomial<C>> Pcp = PolyUfdUtil.<C> introduceLowerVariable(rfac, Pp); 102 103 // Q[t][x] 104 GenPolynomialRing<GenPolynomial<C>> rfac1 = Pc.ring; 105 // System.out.println("rfac1 = " + rfac1.toScript()); 106 107 // A - t P' 108 GenPolynomial<GenPolynomial<C>> tc = rfac1.getONE().multiply(t); 109 // System.out.println("tc = " + tc); 110 GenPolynomial<GenPolynomial<C>> At = Ac.subtract(tc.multiply(Pcp)); 111 // System.out.println("A - tP' = " + At); 112 113 GreatestCommonDivisorSubres<C> engine = new GreatestCommonDivisorSubres<C>(); 114 // = GCDFactory.<C>getImplementation( cfac.coFac ); 115 GreatestCommonDivisorAbstract<AlgebraicNumber<C>> aengine = null; 116 117 // Subresultant von A - t P' 118 List<GenPolynomial<GenPolynomial<C>>> RcList = engine.recursiveUnivariateSubResultantList(Pc, 119 At); // returning 120 GenPolynomial<GenPolynomial<C>> Rc = RcList.get(RcList.size() - 1); // just getting R 121 //System.out.println("R = " + Rc); 122 123 // SquareFree(R) 124 SortedMap<GenPolynomial<C>, Long> resSquareFree = sqf.squarefreeFactors(Rc.leadingBaseCoefficient()); 125 if (logger.isInfoEnabled()) { 126 logger.info("SquareFree(R) = " + resSquareFree); 127 } 128 129 // First Loop 130 SortedMap<GenPolynomial<C>, Long> sfactors = null; 131 GenPolynomial<AlgebraicNumber<C>> Sa = null; 132 GenPolynomial<GenPolynomial<C>> S = null; 133 GenPolynomial<C> Q = null; 134 for (Entry<GenPolynomial<C>, Long> qi : resSquareFree.entrySet()) { 135 Q = qi.getKey(); 136 // System.out.println("\nr(t) = " + r); 137 if (Q.isConstant()) { 138 continue; 139 } 140 if (Q.degreeMin() == 1) { 141 Q = Q.divide(t); 142 } 143 vars = pfac.newVars("z_"); 144 pfac = pfac.copy(); 145 @SuppressWarnings("unused") 146 String[] unused = pfac.setVars(vars); 147 GenPolynomial<C> qi2 = pfac.copy(Q); // hack to exchange the variables 148 // System.out.println("r(z_) = " + r); 149 AlgebraicNumberRing<C> afac = new AlgebraicNumberRing<C>(qi2); 150 if (logger.isDebugEnabled()) { 151 logger.debug("afac = " + afac.toScript()); 152 } 153 AlgebraicNumber<C> a = afac.getGenerator(); 154 // no: a = a.negate(); 155 // System.out.println("a = " + a); 156 157 // K(alpha)[x] 158 GenPolynomialRing<AlgebraicNumber<C>> pafac = new GenPolynomialRing<AlgebraicNumber<C>>(afac, 159 Pc.ring); 160 161 // 1Condition 2Condition i = deg(D) + Check condition again! 162 if (qi2.degree() > 0) { 163 if (qi.getValue() == Pc.degree()) { 164 GenPolynomial<C> sExp = P; 165 // convert to K(alpha)[x] 166 Sa = PolyUtil.<C> convertToAlgebraicCoefficients(pafac, sExp); 167 afactors.add(a); 168 adenom.add(Sa); 169 return new LogIntegral<C>(A, P, cfactors, cdenom, afactors, adenom); 170 } 171 int countj = 1; 172 // RcList.remove(RcList.size()-1); 173 for (GenPolynomial<GenPolynomial<C>> Ri : RcList) { 174 if (qi.getValue() == Ri.degree()) { 175 S = Ri; 176 // convert to K(alpha)[x] 177 Sa = PolyUtil.convertRecursiveToAlgebraicCoefficients(pafac, S); 178 sfactors = sqf.squarefreeFactors(S.leadingBaseCoefficient()); 179 if (logger.isInfoEnabled()) { 180 logger.info("SquareFree(S)" + sfactors); 181 } 182 } 183 } 184 for (GenPolynomial<C> ai : sfactors.keySet()) { 185 GenPolynomial<AlgebraicNumber<C>> aiC = PolyUtil.<C> convertToAlgebraicCoefficients(pafac, 186 ai); 187 GenPolynomial<AlgebraicNumber<C>> qiC = PolyUtil.<C> convertToAlgebraicCoefficients(pafac, 188 qi2); 189 if (aengine == null) { 190 aengine = GCDFactory.<AlgebraicNumber<C>> getImplementation(afac); 191 } 192 GenPolynomial<AlgebraicNumber<C>> gcd = aengine.baseGcd(aiC, qiC); 193 gcd = gcd.power(countj); 194 Sa = (Sa.divide(gcd)); 195 countj++; 196 if (Sa.isZERO() || a.isZERO()) { 197 System.out.println("warning constant Sa ignored"); 198 continue; 199 } 200 } 201 //System.out.println("S = " + Sa); 202 afactors.add(a); 203 adenom.add(Sa.monic()); 204 // adenom.add(Sa.monic()); 205 } 206 } 207 return new LogIntegral<C>(A, P, cfactors, cdenom, afactors, adenom); 208 } 209}