def __call__(self, s): assert len(s) > 0 suffix = 1 if s != "now" and s != "today": if len(s) > 1 and s[:2] != "0x": if s[-1] in suffixes_ln: exponent = suffixes_ln[s[-1]] if exponent >= 0: suffix = Zn(10**exponent) else: suffix = mpf("1e" + str(exponent)) s = s[:-1] for func in (self.j, self.i, self.q, self.v, self.r, self.c): x = func(s) if x != None: if suffix == 1: return x if isint(x): if isint(suffix): return Zn(suffix*x) else: return suffix*mpf(int(x)) elif isinstance(x, Rational): if isint(suffix): return Rational(suffix*x.n, x.d) else: return suffix*x.mpf() elif isinstance(x, mpf) or \ isinstance(x, mpc) or \ isinstance(x, mpi): if isint(suffix): return mpf(int(suffix))*x else: return suffix*x else: return None return None
def gcd(a, b): '''Determine the greatest common divisor of integers u and v. Euclid's algorithm from Knuth, vol 2, pg 320. ''' if not isint(a) or not isint(b): raise ValueError("Arguments must be integers") a, b = int(a), int(b) if a == 0: return b if b == 0: return a while b != 0: a, b = b, a % b return a
def Convert(x, arg_type, digits=0): '''Converts amongst the numerical types. Some conversions lose information. The digits argument controls the precision of a conversion of a real to a rational. ''' e = SyntaxError("Unknown type") if arg_type == INT: if isint(x): return Zn(x) elif isinstance(x, Rational): return Zn(int(mpf(x.n)/mpf(x.d))) elif isinstance(x, mpf): return Zn(int(x)) elif isinstance(x, mpc): return Zn(int(abs(x))) elif isinstance(x, mpi): return Zn(int(x.mid)) elif isinstance(x, Julian): return Zn(int(x)) else: raise e elif arg_type == RAT: if isint(x): return Rational(int(x), 1) elif isinstance(x, Rational): return x elif isinstance(x, mpf): return Rational().frac(x, digits) elif isinstance(x, mpc): return Rational().frac(abs(x), digits) elif isinstance(x, mpi): return Rational(x.mid) elif isinstance(x, Julian): return Rational().frac(x.to_mpf(), digits) else: raise e elif arg_type == MPF: if isint(x): return mpf(int(x)) elif isinstance(x, Rational): return x.mpf() elif isinstance(x, mpf): return x elif isinstance(x, mpc): return abs(x) elif isinstance(x, mpi): return x.mid elif isinstance(x, Julian): return x.to_mpf() else: raise e elif arg_type == MPC: if isint(x): return mpc(int(x)) elif isinstance(x, Rational): return x.mpc() elif isinstance(x, mpf): return mpc(x, 0) elif isinstance(x, mpc): return x elif isinstance(x, mpi): return mpc(x.mid, 0) elif isinstance(x, Julian): return mpc(x.to_mpf(), 0) else: raise e elif arg_type == MPI: if isint(x): return mpi(int(x)) elif isinstance(x, Rational): return x.mpi() elif isinstance(x, mpf): return mpi(x) elif isinstance(x, mpc): return mpi(abs(x)) elif isinstance(x, mpi): return x elif isinstance(x, Julian): if isinstance(x.value, mpf): return mpi(x.value) else: return x.value else: raise e elif arg_type == JUL: if isint(x): return Julian(int(x)) elif isinstance(x, Rational): return Julian(mpf(x.n)/mpf(x.d)) elif isinstance(x, mpf): return Julian(x) elif isinstance(x, mpc): return Julian(abs(x)) elif isinstance(x, mpi): return Julian(x) elif isinstance(x, Julian): return x else: raise e else: raise SyntaxError("Unknown type")