【问题标题】:How to calculate with a number this big?这么大的数字怎么计算?
【发布时间】:2014-02-17 20:22:10
【问题描述】:

我现在正在自学 Pascal 一个月,但我遇到了一个我似乎无法解决的问题。基本上我有 2 个数字,NM,其中 N 小于 10100 000 M 小于 108 且都大于 0。我需要计算 N mod M

我不知道该怎么做,即使是QWord。我用string 试过了,但我不知道有什么好方法。它总是对我来说太复杂了,因为我使用 for 函数,我从字符串 N 和字符串 M 中获取最后一个数字,然后我用两个 @ 减去它们987654325@ 函数(其中 N 的最后一位高于或与 M 的最后一位相同,如果低于)。基本上,我认为这个简单的问题太复杂了。

【问题讨论】:

  • 对于字符串,我必须做很多从字符串到整数的转换,然后是整数到字符串或字符等的转换......
  • "... N 小于 10^8"?你的意思是“……而且 M 小于 10^8”?
  • @MikeW 你是什么意思没有办法轻易做到这一点?我看不出宇宙的信息容量与进行 bignum 计算有什么关系。
  • 这是我国帕斯卡较老的比赛之一的问题,他们还没有发布解决方案。它真的让我很感兴趣如何解决它,顺便说一句,我知道 googol、googolplex、googolplexian 等,但我认为这与物理学没有任何联系:) 是的,这个数字是 10^100 000,即 1 后跟100 000 个零。猜猜看,这个问题的时间限制是 0.1 秒

标签: pascal modulus bignum


【解决方案1】:

有一些 bignum 包浮动,例如来自http://www.wolfgang-ehrhardt.de/mp_intro.html 的开源 MPArith 包。使用随附的演示计算器,您可以轻松超越时间限制:

D:\Xtools\MPArith>t_calc.exe
T_CALC using MPArith V1.26.05 (31/32 bit) [mp_calc]  (c) W.Ehrhardt 2006-2013
Karatsuba cutoffs:  mul/sqr = 16/32,   Toom-3 cutoffs: mul/sqr = 32/64
Burnikel/Ziegler div cutoff = 32,   MaxBit = 520093696,   MaxFact = 22623931
Type "?<enter>" to get some info about commands, "\q" or "quit" to end.

[D]:=> 10^100000 mod (10^8-1)
Result = 1
[D]:=> .
Time = 20.128 ms
[D]:=> 10^100000;
Result =  [>0, 332193 bits,  chksum=$CE01C341,  time=46.994 ms]

但根据您的要求和示例,您甚至可能会得到您的结果 没有 bignum 包。如果你想计算a ^ b mod n不要 计算 a ^ b,然后在第二步中减少mod n,但是您在循环中减少每个产品。和 您应该使用快速二进制求幂,例如描述和伪 代码http://en.wikipedia.org/wiki/Modular_exponentiation。 对于 10^8 阶的模块 n,您需要减少两个 31/32 位整数的乘积 因此您需要int64 左右来积累产品(这对您拥有QWord 的Pascal 版本来说应该不是问题)。我想这样的程序会比 MPArith bignum 快得多 代码是 20 毫秒。

【讨论】:

猜你喜欢
  • 2017-04-11
  • 2011-12-03
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
相关资源
最近更新 更多