在 Sagemath 中提取数字的第 n 位
Extract the n-th digit of a number in Sagemath
如何在 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
。
这个数字确实是9。但是后面的数字也是9:这部分十进制展开为...9999237...四舍五入将这些9s滚为0s,将1带入更高的数字。
因此您需要一些额外的数字以避免您感兴趣的数字受到四舍五入的影响。多少取决于数量;我们事先不知道是否有从该位置开始的十亿个 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])
这个 returns 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...四舍五入。
如何在 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
。
这个数字确实是9。但是后面的数字也是9:这部分十进制展开为...9999237...四舍五入将这些9s滚为0s,将1带入更高的数字。
因此您需要一些额外的数字以避免您感兴趣的数字受到四舍五入的影响。多少取决于数量;我们事先不知道是否有从该位置开始的十亿个 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])
这个 returns 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...四舍五入。