在Sagemath中提取数字的第n位数字

时间:2018-01-10 15:54:03

标签: python math sage

如何在Sagemath中提取数字的第n位?我们必须在Sagemath中计算pi + e的第13787位数字。我的方法如下:

sage: xi = e + pi
....: var1 = xi.n(digits=13786+1)
....: var2 = xi.n(digits=13787+1)
....: var3 = ((var2-var1) * 10^13787).trunc()
....: var3
0

这给了我0,但它应该是9

1 个答案:

答案 0 :(得分:3)

这个数字确实是9.但随后的数字也是9:十进制扩展的这一部分变为...... 9999237 ...舍入将这些9s滚动到0,将1加到更高的数字。

所以你需要一些额外的数字,以避免你感兴趣的数字受到舍入的影响。多少取决于数量;如果从该位置开始没有10亿9的序列,我们事先不知道。这里我使用了10个额外的数字

xi = e + pi
n = 13787
offset = 1 + floor(log(xi, 10))   # the first significant figure is not always the first digit after decimal dot, so we account for that 
extra = 10
digit = int(str(xi.n(digits = n + offset + extra))[-1 - extra])

这会返回9.我认为使用str进行提取比减去两个几乎相等的数字更可靠,并希望那里不会有额外的精确丢失。

当然,包括像10这样的幻数并不可靠。这是一个更好的版本,从10个额外的数字开始,然后增加数字,直到我们不再有00000000 ...结果。

xi = e + pi
n = 13787
offset = 1 + floor(log(xi, 10))
extra = 10
while True:
   digits = str(xi.n(digits = n + offset + extra))[-1 - extra:]
   if digits == "0" * len(digits):
       extra *= 2
   else:
       digit = int(digits[0])
       break
print(digit)

如果数字保持为0,这将永远循环,正确如此:实际上不知道数字是什么,我们永远无法确定... 0000000 ...我们得到的是不是真的... 999999999942 ...四舍五入。