Julia 理解BigInt的用法

Julia 理解BigInt的用法,julia,bigint,Julia,Bigint,我正在努力理解如何正确使用BigInt。在我看来,当Int64或Int128不够时,应该使用BigInt,而且显然BigInt使用任意精度的算术(我不知道) 假设我想计算某个大数字的阶乘,例如30。我不知道存储阶乘(30)需要多少位,但两者都需要 test = Int128 test = factorial(30) 及 生成明显不正确的-8764578968847253504 根据Julia lang文档,似乎为这种类型(BigInt)定义了常用的数学运算符,结果被提升为BigInt。所以我看

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

假设我想计算某个大数字的阶乘,例如30。我不知道存储阶乘(30)需要多少位,但两者都需要

test = Int128
test = factorial(30)

生成明显不正确的
-8764578968847253504

根据Julia lang文档,似乎为这种类型(BigInt)定义了常用的数学运算符,结果被提升为
BigInt
。所以我看不出我做错了什么,我显然误解了什么。希望你们中的一些人能给我一个解释:)


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

我想在这个答案前面加上一句话,我对Julia一无所知,但是在阅读文档时可以看到,他们使用的是
factorial(BigInt(40))
,因此似乎需要显式转换

尝试
factorial(BigInt(30))
看看这是否给出了预期的结果

此外,从该页:

但是,上面的基元类型和 BigInt/BigFloat不是自动的,必须明确说明

因此,我将尝试3种方法,看看哪些方法有效:

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

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

test = factorial(BigInt(30))  
将工作,将在整个计算过程中使用
BigInt

test = BigInt(factorial(30))
不起作用,将已溢出的Int结果转换为BigInt

test = BigInt(factorial(BigInt(30)))
将工作,但外部BigInt是多余的,因为结果已经是一个BigInt

test = BigInt(factorial(BigInt(30)))
你写的代码

test = BigInt
test = factorial(30)
基本上没有意义。你说

根据Julia lang的文档,似乎 为该类型(BigInt)定义了数学运算符,并且 结果将提升为BigInt

test = BigInt(factorial(BigInt(30)))
所以我猜你认为这意味着“结果应该是一个BigInt”,但事实并非如此。它将类型
BigInt
分配给变量测试,然后在
Int
literal 30上计算
factorial
。然后,它将其存储在
test
中,挤压上一个值,即
BigInt
。也许可以查看手册的类型部分。Julia不会在溢出时自动将
Ints
升级为
BigInts
——您需要从
BigInt
开始。这是出于性能(和其他)原因


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

关于任意精度数学的相关问题。注:我只花了两天时间试验朱莉娅语言。在看了这篇文章后,我添加了BigInt铸造,它又打印了一个数字。我一定是遗漏了一些东西,因为它仍然无法执行,就像它对所有需要执行的计算使用任意精度一样。我还必须添加try/catch,因为如果不是Merseene素数,IsmerSenneTime函数会抛出错误。根据文件,我认为它应该返回真或假

# 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

谢谢你。工作。这实际上很有意义,因为Julia中的大多数函数都是多态的(我想我在这里正确地使用了多态),所以当
factorial
得到
BigInt
类型时,它也会返回
BigInt
类型,这与我第一次做的相反,我给它一个
Int
类型来澄清,显式强制转换成功了,您列表中的第一个示例非常成功,但我没有尝试其他示例。请注意,在Julia中,如果我理解正确,
BigInt(30)
不是强制转换,也不是转换或提升(尽管这些操作在Julia中是可能的)。实际上,您正在调用构造函数。解释了这一点,也解释了更多的细节。感谢你的解释,这很有意义,在处理
BigInts
时会坚持显式转换(从现在开始:)我想我还没有掌握这里的发布,因为它已经完全抹掉了格式。我想知道将来是否可以只使用HTML标签;比如?我最终通过将limit重新定义为limit=BigInt(typemax(Int128))+1实现了它