处理朱莉娅的大数字

时间:2018-04-25 13:39:46

标签: julia

在Python中,我可以执行以下操作来获取N中所有数字的总和,其中N=99999 ** 99999。可以使用sum(map(int,str(N)))获得总和。

如何在Julia中找到N中所有数字的总和?

4 个答案:

答案 0 :(得分:5)

你正在击中整数溢出。尝试使用BigInt s。

julia> N=digits(big(99999)^99999)
499995-element Array{Int64,1}:
 9
 9
 9
 9
 9
 8
 9
 9
 9
 9
 ⋮
 5
 0
 8
 2
 1
 8
 8
 7
 6
 3

请注意

julia> typemax(Int64)
9223372036854775807

太小了,但BigInt s是任意大小的。 big(i)i变为大(BigFloat(如果它是浮点数),BigInt(如果它是整数)。 Julia并不默认使用bigs /任意大小的数字,因为它们很慢,但如果你调用它们,那么大多数调度的类型稳定性将传播大类型,因此big(i)^j最终会变大。

答案 1 :(得分:0)

这个问题有点老了,但是我发现了一个有趣的性能改进,至少对于使用Julia 1.5或更早版本的用户来说,对新用户(或者更高级的用户可以解释)很有用。

默认情况下,Julia将{9991”强制转换为Int64。但是,99999⁹⁹⁹⁹⁹是一个很大的数字,不适合Int64变量(最多支持2⁶³)。然后,您必须使用big(99999)或等效的BigInt(99999)(Python会自动执行)。

一个人可以写

sum(digits(big(99999)^99999))

它绝对有效。进行一些基准测试,我发现:

  • Python:
>>> %timeit sum(map(int,str(99999**99999)))
4.9 s ± 5.43 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
  • 朱莉娅:
julia> @benchmark sum(digits(big(99999)^99999))
BenchmarkTools.Trial: 
  memory estimate:  142.75 GiB
  allocs estimate:  5343475
  --------------
  minimum time:     79.833 s (3.24% GC)
  median time:      79.833 s (3.24% GC)
  mean time:        79.833 s (3.24% GC)
  maximum time:     79.833 s (3.24% GC)
  --------------
  samples:          1
  evals/sample:     1

我知道。朱莉娅是“光速之上”,“比C和Fortran更快”的语言。为什么它会(比)“ Python”(“海龟语言”)慢得多?以及我们如何处理分配的大量内存? 让我们尝试一下用Julia重写的“ pythonic”算法:

julia> sum(map(x -> parse(Int32, x), collect(string(big(99999)^99999))))

我知道这听起来很奇怪并且违反直觉,但是数字说明了一切。这是我的结果。

  • Julia(“ Pythonic”方式):
julia> @benchmark sum(map(x -> parse(Int32, x), collect(string(big(99999)^99999))))
BenchmarkTools.Trial: 
  memory estimate:  13.56 MiB
  allocs estimate:  991
  --------------
  minimum time:     62.130 ms (0.00% GC)
  median time:      63.111 ms (0.00% GC)
  mean time:        63.183 ms (0.24% GC)
  maximum time:     66.055 ms (0.68% GC)
  --------------
  samples:          80
  evals/sample:     1

备注。

  • %timeit是IPython的魔力。 @benchmark是由BenchmarkTools.jl实现的宏(需要安装)。
  • 在上一个Julia基准测试中,可以使用Int8来映射字符串来改进内存分配,但是时间完全相同。

总而言之,它可以在Julia中完成,既可以使用简单但缓慢的代码,也可以使用冗长但快速的代码。我无法确切解释为什么。

答案 2 :(得分:-1)

你在寻找的是sum(digits(N))(人们必须爱Julia,因为它很简单!)。

julia> N=99999^99999
7466109992980035935

julia> sum(digits(N))
95

答案 3 :(得分:-1)

总而言之。

sum(digits(big(99999)^99999))