def __init__(self,f,fi,exponent,fps=None,fixpoint=0,z0=0,u=None,prec=53,iprec=None,N=5,direction=-1,debug=0): self.attracting = False self.fp = fixpoint self.prec = prec self.f = f self.fi = fi self.N = N if iprec == None: iprec = prec + 10 self.iprec = iprec R = RealField(iprec) F = FormalPowerSeriesRing(R) if fps == None: p = F(f) else: p = F.by_formal_powerseries(fps) pit = p.it(exponent) self.iterate_poly = pit.polynomial(N) self.iterate_raw0 = lambda z: self.fp + self.iterate_poly(z-self.fp)
def __init__(self,b,N,iprec=512,u=None,x0=0): """ x0 is the development point for the Carleman matrix for the slog u is the initial value such that slog(u)=0 or equivalently sexp(0)=u if no u is specified we have slog(x0)=0 """ bsym = b self.bsym = bsym self.N = N self.iprec = iprec x0sym = x0 self.x0sym = x0sym self.prec = None bname = repr(bsym).strip('0').replace('.',',') if bsym == sqrt(2): bname = "sqrt2" if bsym == e**(1/e): bname = "eta" x0name = repr(x0sym) if x0name.find('.') > -1: if x0.is_real(): x0name = repr(float(x0sym)).strip('0').replace('.',',') else: x0name = repr(complex(x0sym)).strip('0').replace('.',',') # by some reason save does not work with additional . inside the path self.path = "savings/itet_%s"%bname + "_N%04d"%N + "_iprec%05d"%iprec + "_a%s"%x0name if iprec != None: b = num(bsym,iprec) self.b = b x0 = num(x0sym,iprec) if x0.is_real(): R = RealField(iprec) else: R = ComplexField(iprec) self.x0 = x0 else: if b == e and x0 == 0: R = QQ else: R = SR self.R = R #Carleman matrix if x0 == 0: #C = Matrix([[ m**n*log(b)**n/factorial(n) for n in range(N)] for m in range(N)]) coeffs = [ln(b)**n/factorial(n) for n in xrange(N)] else: #too slow #C = Matrix([ [ln(b)**n/factorial(n)*sum([binomial(m,k)*k**n*(b**x0)**k*(-x0)**(m-k) for k in range(m+1)]) for n in range(N)] for m in range(N)]) coeffs = [b**x0-x0]+[b**x0*ln(b)**n/factorial(n) for n in xrange(1,N)] def psmul(A,B): N = len(B) return [sum([A[k]*B[n-k] for k in xrange(n+1)]) for n in xrange(N)] C = Matrix(R,N) row = vector(R,[1]+(N-1)*[0]) C[0] = row for m in xrange(1,N): row = psmul(row,coeffs) C[m] = row A = (C - identity_matrix(N)).submatrix(1,0,N-1,N-1) self.A = A print "A computed." if iprec != None: A = num(A,iprec) row = A.solve_left(vector([1] + (N-2)*[0])) print "A solved." self.slog0coeffs = [0]+[row[n] for n in range(N-1)] self.slog0poly = PolynomialRing(R,'x')(self.slog0coeffs[:int(N)/2]) slog0ps = FormalPowerSeriesRing(R)(self.slog0coeffs) sexp0ps = slog0ps.inv() #print self.slog0ps | self.sexp0ps self.sexp0coeffs = sexp0ps[:N] self.sexp0poly = PolynomialRing(R,'x')(self.sexp0coeffs[:int(N)/2]) self.slog_raw0 = lambda z: self.slog0poly(z-self.x0) print "slog reversed." #the primary or the upper fixed point pfp = exp_fixpoint(b,1,prec=iprec) self.pfp = pfp r = abs(x0-pfp) #lower fixed point lfp = None if b <= R(e**(1/e)): lfp = exp_fixpoint(b,0,prec=iprec) r = min(r,abs(x0-lfp)) self.lfp = lfp self.r = r self.c = 0 if not u == None: self.c = - self.slog(u)