On 5 April 2016 at 01:56, Amy Valhausen <amy.vaulhau...@gmail.com> wrote: > > import numpy > (np.longdouble(1.4142)** 6000 )%400 ... > > # The library mpmath is a good solution >>>> import sympy as smp >>>> mp = smp.mpmath > >>>> mp.mp.dps = 50 # Computation precision is 50 digits
50 digits is nowhere near enough. Think about what the number 1.4142**6000 is: it's a big number. If I wrote it out in digits it might look something like: 5432321453425234...234234234.123235345345 The digits that contain the precision needed to get the remainder modulo 400 begin just before the decimal point. So how many digits are there before that? If d is the number of digits preceding the decimal point then loosely: 10**d = 1.4142**6000 Which gives that d = log10(1.4142**6000) = 6000*log10(1.4142) ~= 903 So if you want an answer that's good for m digits you'll need to use about 900+m digits for the exponentiation: In [1]: from sympy import mpmath In [2]: mpmath.mp.dps = 950 In [3]: mpmath.mpf('1.4142') ** 6000 % 400 Out[3]: mpf('271.048181008630921815939109488389292518324580362344398848121124779167483584534976647550313880646779627157871790825164801629065802757168057723902165889739990234375') BTW it's also possible to do this particular calculation easily enough just with Python stdlib (and without numpy or sympy): In [1]: from fractions import Fraction In [2]: float(Fraction('1.4142')**6000 % 400) Out[2]: 271.04818100863093 I though that it should be possible to easily do this with sympy Floats but it doesn't seem to work: In [1]: x = S(1.4142) In [2]: x Out[2]: 1.41420000000000 In [3]: x**6000 Out[3]: 1.16144178843571e+903 In [4]: x**6000 % 400 Out[4]: 32.0000000000000 This doesn't work because auto-evaluation of x**6000 destroyed all the precision so I tried: In [5]: Pow(x, 6000, evaluate=False) Out[5]: 6000 1.4142 In [6]: Pow(x, 6000, evaluate=False) % 400 Out[6]: Mod(1.16144178843571e+903, 400) Well that's annoying. It's gone ahead and auto-evaluated the x**6000 but created a Mod object instead of evaluating the modular division. So let's disable evaluation of at the mod step as well: In [10]: Mod(Pow(x, 6000, evaluate=False), 400, evaluate=False).evalf(50) Out[10]: ⎛ 6000 ⎞ Mod⎝1.4142 , 400⎠ How do I get that to actually evaluate? -- Oscar -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sympy+unsubscr...@googlegroups.com. To post to this group, send email to sympy@googlegroups.com. Visit this group at https://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAHVvXxRWe%2BDykG15%3Dks%2Bs04mF%2BgS2LmtRJ_kmAWQdwXNHAg5Bw%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.