了解BigInt的使用

时间:2014-10-07 13:57:56

标签: julia bigint

我正在努力了解如何正确使用BigInt。在我看来,当BigIntInt64不够时,应该使用Int128,显然BigInt使用任意精度算术(我不知道)。

假设我想计算一些大数的阶乘,例如30.我不知道存储factorial(30)需要多少位,但两者都

test = Int128
test = factorial(30)

test = BigInt
test = factorial(30)

产生-8764578968847253504,这显然是不正确的。

根据Julia lang文档,似乎通常的数学运算符是为这种类型定义的(BigInt),结果被提升为BigInt。因此,我没有看到我做错了什么,我显然误解了一些事情。希望你们中的一些人可能对我有一个解释:)

PS:如果有话要说,我正在运行64位版本的Windows 7

3 个答案:

答案 0 :(得分:8)

factorial将计算与其参数类型相同的结果,因此

test = factorial(BigInt(30))  

可行,将在整个计算过程中使用BigInt

test = BigInt(factorial(30))

无法工作,将已经溢出的Int结果转换为BigInt。

test = BigInt(factorial(BigInt(30)))

可行,但外部BigInt是多余的,因为结果已经是BigInt。

您编写的代码

test = BigInt
test = factorial(30)

基本上没有意义。你说

  

根据Julia lang的文档,似乎是平常的   数学运算符是为这种类型(BigInt)定义的   结果被提升为BigInt。

所以我猜你认为这意味着"结果应该是BigInt",但它并没有。它将类型BigInt分配给变量测试,然后在factorial字面值上计算Int。然后将其存储在test中,压缩先前的值,即{ {1}}。也许请查看手册的“类型”部分。 Julia在溢出时不会自动将BigInt提升为Ints - 您需要以BigInts开头。这是出于性能(和其他)原因。

大多数操作都是在BigInt s上定义的 - 只有一些线性代数操作(如特征值)可能不是。只需将您的号码更改为BigInt一次,它就会在整个计算过程中传播。大多数人永远不会需要BigInt - 往往只会在研究环境中出现。 BigInt(与平台整数大小相同,因此计算机上为Int)变得非常大 - 而且速度很快。

答案 1 :(得分:0)

我想在这个答案的前面加上我对Julia一无所知的断言,但是在https://docs.julialang.org/en/v1/manual/integers-and-floating-point-numbers/#Arbitrary-Precision-Arithmetic-1阅读文档可以看出他们使用factorial(BigInt(40)),所以显式演员似乎是必需的。

尝试factorial(BigInt(30)),看看是否能产生预期结果。

此外,从该页面开始:

  

但是,在上面的原始类型之间键入提升   BigInt / BigFloat不是自动的,必须明确说明。

所以我会尝试3件事,看看有什么作用:

test = factorial(BigInt(30))
test = BigInt(factorial(30))
test = BigInt(factorial(BigInt(30)))

答案 2 :(得分:0)

有关任意精度数学的相关问题。请注意,我只花了两天时间尝试使用Julia语言。查看此帖子后,我添加了BigInt铸件,该铸件又打印出一个数字。我必须丢失一些东西,因为它仍然无法执行,就好像它对所需的所有计算都使用了任意精度。我还必须添加try / catch,因为ismersenneprime函数不是Merseene质数时会引发错误。根据文档,我认为应该返回true或false。

# Perfect numbers are 2^(p-1)x(2^p-1) if 2^p-1 is Mersenne prime.
using Compat
using Primes

limit = 1000000

for p = 1:limit
  perfect = BigInt(2^(p-1))*(BigInt(2^p)-1)
  try 
    if ismersenneprime(BigInt(2^p)-1)
      println("$p $perfect")
    end
  catch e
#   println(e)
  end
end

2 6
3 28
5 496
7 8128
13 33550336
17 8589869056
19 137438691328
31 2305843008139952128
61 2658455991569831744654692615953842176