예제 #1
0
    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)
예제 #2
0
    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)