001 /* 002 * $Id: PolynomialTaylorFunction.java 3596 2011-04-06 20:59:42Z kredel $ 003 */ 004 005 package edu.jas.ps; 006 007 008 import java.util.List; 009 010 import edu.jas.poly.ExpVector; 011 import edu.jas.poly.GenPolynomial; 012 import edu.jas.poly.PolyUtil; 013 import edu.jas.structure.RingElem; 014 015 016 /** 017 * Polynomial functions capable for Taylor series expansion. 018 * @param <C> ring element type 019 * @author Heinz Kredel 020 */ 021 022 public class PolynomialTaylorFunction<C extends RingElem<C>> implements TaylorFunction<C> { 023 024 025 final GenPolynomial<C> pol; 026 027 028 final long facul; 029 030 031 public PolynomialTaylorFunction(GenPolynomial<C> p) { 032 this(p, 1L); 033 } 034 035 036 public PolynomialTaylorFunction(GenPolynomial<C> p, long f) { 037 pol = p; 038 facul = f; 039 } 040 041 042 /** 043 * To String. 044 * @return string representation of this. 045 */ 046 @Override 047 public String toString() { 048 return pol.toString(); 049 } 050 051 052 /** 053 * Get the factorial coefficient. 054 * @return factorial coefficient. 055 */ 056 //JAVA6only: @Override 057 public long getFacul() { 058 return facul; 059 } 060 061 062 /** 063 * Test if this is zero. 064 * @return true if this is 0, else false. 065 */ 066 public boolean isZERO() { 067 return pol.isZERO(); 068 } 069 070 071 /** 072 * Deriviative. 073 * @return deriviative of this. 074 */ 075 //JAVA6only: @Override 076 public TaylorFunction<C> deriviative() { 077 return new PolynomialTaylorFunction<C>(PolyUtil.<C> baseDeriviative(pol)); 078 } 079 080 081 /* 082 * Partial deriviative. 083 * @param r index of the variable. 084 * @return partial deriviative of this with respect to variable r. 085 public TaylorFunction<C> deriviative(int r) { 086 return new PolynomialTaylorFunction<C>(PolyUtil. <C> baseDeriviative(pol,r)); 087 } 088 */ 089 090 091 /** 092 * Multi-partial deriviative. 093 * @param i exponent vector. 094 * @return partial deriviative of this with respect to all variables. 095 */ 096 public TaylorFunction<C> deriviative(ExpVector i) { 097 GenPolynomial<C> p = pol; 098 long f = 1L; 099 if (i.signum() == 0 || pol.isZERO()) { 100 return new PolynomialTaylorFunction<C>(p, f); 101 } 102 for (int j = 0; j < i.length(); j++) { 103 long e = i.getVal(j); 104 if (e == 0) { 105 continue; 106 } 107 int jl = i.length() - 1 - j; 108 for (long k = 0; k < e; k++) { 109 p = PolyUtil.<C> baseDeriviative(p, jl); 110 f *= (k + 1); 111 if (p.isZERO()) { 112 return new PolynomialTaylorFunction<C>(p, f); 113 } 114 } 115 } 116 //System.out.println("i = " + i + ", f = " + f + ", der = " + p); 117 return new PolynomialTaylorFunction<C>(p, f); 118 } 119 120 121 /** 122 * Evaluate. 123 * @param a element. 124 * @return this(a). 125 */ 126 //JAVA6only: @Override 127 public C evaluate(C a) { 128 return PolyUtil.<C> evaluateMain(pol.ring.coFac, pol, a); 129 } 130 131 132 /** 133 * Evaluate at a tuple of elements. 134 * @param a tuple of elements. 135 * @return this(a). 136 */ 137 public C evaluate(List<C> a) { 138 return PolyUtil.<C> evaluateAll(pol.ring.coFac, pol.ring, pol, a); 139 } 140 141 }