001/* 002 * $Id: ElementaryIntegrationLazard.java 5999 2020-03-17 15:44:50Z kredel $ 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.logging.log4j.LogManager; 014import org.apache.logging.log4j.Logger; 015 016import edu.jas.poly.AlgebraicNumber; 017import edu.jas.poly.AlgebraicNumberRing; 018import edu.jas.poly.GenPolynomial; 019import edu.jas.poly.GenPolynomialRing; 020import edu.jas.poly.PolyUtil; 021import edu.jas.structure.GcdRingElem; 022import edu.jas.structure.RingFactory; 023import edu.jas.ufd.GCDFactory; 024import edu.jas.ufd.GreatestCommonDivisorAbstract; 025import edu.jas.ufd.GreatestCommonDivisorSubres; 026import edu.jas.ufd.PolyUfdUtil; 027 028 029/** 030 * Method related to elementary integration. Lazard-Rioboo-Trager integration of 031 * the logarithmic part. 032 * 033 * @author Youssef Elbarbary 034 * @param <C> coefficient type 035 */ 036 037public class ElementaryIntegrationLazard<C extends GcdRingElem<C>> extends ElementaryIntegration<C> { 038 039 040 private static final Logger logger = LogManager.getLogger(ElementaryIntegrationLazard.class); 041 042 043 /** 044 * Constructor. 045 */ 046 public ElementaryIntegrationLazard(RingFactory<C> br) { 047 super(br); 048 } 049 050 051 /** 052 * Univariate GenPolynomial integration of the logaritmic part, Lazard - 053 * Rioboo - Trager 054 * 055 * @param A univariate GenPolynomial, deg(A) < deg(P). 056 * @param P univariate irreducible GenPolynomial. // gcd(A,P) == 1 automatic 057 * @return logarithmic part container. 058 */ 059 @Override 060 public LogIntegral<C> integrateLogPart(GenPolynomial<C> A, GenPolynomial<C> P) { 061 if (P == null || P.isZERO()) { 062 throw new IllegalArgumentException("P == null or P == 0"); 063 } 064 // System.out.println("\nP_base_algeb_part = " + P); 065 GenPolynomialRing<C> pfac = P.ring; // K[x] 066 if (pfac.nvar > 1) { 067 throw new IllegalArgumentException("only for univariate polynomials " + pfac); 068 } 069 if (!pfac.coFac.isField()) { 070 throw new IllegalArgumentException("only for field coefficients " + pfac); 071 } 072 List<C> cfactors = new ArrayList<C>(); 073 List<GenPolynomial<C>> cdenom = new ArrayList<GenPolynomial<C>>(); 074 List<AlgebraicNumber<C>> afactors = new ArrayList<AlgebraicNumber<C>>(); 075 List<GenPolynomial<AlgebraicNumber<C>>> adenom = new ArrayList<GenPolynomial<AlgebraicNumber<C>>>(); 076 077 // P linear 078 if (P.degree(0) <= 1) { 079 cfactors.add(A.leadingBaseCoefficient()); 080 cdenom.add(P); 081 return new LogIntegral<C>(A, P, cfactors, cdenom, afactors, adenom); 082 } 083 084 // deriviative 085 GenPolynomial<C> Pp = PolyUtil.<C> baseDeriviative(P); 086 // no: Pp = Pp.monic(); 087 // System.out.println("\nP = " + P); 088 089 // Q[t] 090 String[] vars = new String[] { "t" }; 091 GenPolynomialRing<C> cfac = new GenPolynomialRing<C>(pfac.coFac, 1, pfac.tord, vars); 092 GenPolynomial<C> t = cfac.univariate(0); 093 // System.out.println("t = " + t); 094 095 // Q[x][t] 096 GenPolynomialRing<GenPolynomial<C>> rfac = new GenPolynomialRing<GenPolynomial<C>>(pfac, cfac); // sic 097 // System.out.println("rfac = " + rfac.toScript()); 098 099 // transform polynomials to bi-variate polynomial 100 GenPolynomial<GenPolynomial<C>> Ac = PolyUfdUtil.<C> introduceLowerVariable(rfac, A); 101 GenPolynomial<GenPolynomial<C>> Pc = PolyUfdUtil.<C> introduceLowerVariable(rfac, P); 102 GenPolynomial<GenPolynomial<C>> Pcp = PolyUfdUtil.<C> introduceLowerVariable(rfac, Pp); 103 104 // Q[t][x] 105 GenPolynomialRing<GenPolynomial<C>> rfac1 = Pc.ring; 106 // System.out.println("rfac1 = " + rfac1.toScript()); 107 108 // A - t P' 109 GenPolynomial<GenPolynomial<C>> tc = rfac1.getONE().multiply(t); 110 // System.out.println("tc = " + tc); 111 GenPolynomial<GenPolynomial<C>> At = Ac.subtract(tc.multiply(Pcp)); 112 // System.out.println("A - tP' = " + At); 113 114 GreatestCommonDivisorSubres<C> engine = new GreatestCommonDivisorSubres<C>(); 115 // = GCDFactory.<C>getImplementation( cfac.coFac ); 116 GreatestCommonDivisorAbstract<AlgebraicNumber<C>> aengine = null; 117 118 // Subresultant von A - t P' 119 List<GenPolynomial<GenPolynomial<C>>> RcList = engine.recursiveUnivariateSubResultantList(Pc, 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}