Pascal 这么大的数字怎么算?

Pascal 这么大的数字怎么算?,pascal,modulus,bignum,Pascal,Modulus,Bignum,我现在一个月都在自学帕斯卡,我遇到了一个似乎无法解决的问题。基本上我有两个数字,N和M,其中N小于10100000,M小于108,两者都大于0。我需要计算N模M 我不知道怎么做,即使是使用QWord。我用string试过,但我不知道一个好方法。它对我来说总是太复杂了,因为我使用了一个for函数,从字符串N和字符串M中得到最后一个数字,然后用两个if函数减去它们(其中N的最后一个数字大于或等于M的最后一个数字,如果它小于)。基本上,对于这个简单的问题来说,它变得太复杂了。有一些bignum包在浮动

我现在一个月都在自学帕斯卡,我遇到了一个似乎无法解决的问题。基本上我有两个数字,N和M,其中N小于10100000,M小于108,两者都大于0。我需要计算N模M


我不知道怎么做,即使是使用
QWord
。我用
string
试过,但我不知道一个好方法。它对我来说总是太复杂了,因为我使用了一个
for
函数,从字符串N和字符串M中得到最后一个数字,然后用两个
if
函数减去它们(其中N的最后一个数字大于或等于M的最后一个数字,如果它小于)。基本上,对于这个简单的问题来说,它变得太复杂了。

有一些bignum包在浮动,例如来自的开源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]
D:\Xtools\MPArith>t\u calc.exe
使用MPArith V1.26.05(31/32位)[mp_CALC](c)W.Ehrhardt 2006-2013
Karatsuba截止值:mul/sqr=16/32,Toom-3截止值:mul/sqr=32/64
Burnikel/Ziegler分区截止值=32,MaxBit=520093696,MaxFact=22623931
键入“?”以获取有关命令的一些信息,“\q”或“quit”以结束。
[D] :=>10^100000模(10^8-1)
结果=1
[D] :=>。
时间=20.128毫秒
[D] :=>10^100000;
结果=[>0,332193位,chksum=$CE01C341,时间=46.994毫秒]
但根据您的要求和示例,您甚至可能会得到结果 没有bignum包。如果你想计算a^b mod n,你不需要 计算a^b
a^b
,然后在第二步中减少
mod n
,但你减少了循环中的每个产品。及 您应该使用快速二进制求幂,例如,请参见说明和伪函数 代码在。 对于阶数为10^8的模块n,需要将两个31/32位整数的乘积减少 因此,您需要
int64
左右来累积产品(这对于具有
QWord
的Pascal版本来说应该不是问题)。我想这样的程序会比MPArith bignum快得多
用它的20毫秒进行编码。

同样,对于字符串,我必须做大量的从字符串到整数的转换,然后从整数到字符串或字符等…“…N小于10^8”?你的意思是“…M小于10^8”@MikeW你是说没有办法轻松做到这一点?我看不出宇宙的信息容量与bignum计算有什么关系。这是我国帕斯卡的一个老竞赛中的问题,他们还没有发布解决方案。这真的让我很好奇如何解决它,顺便说一句,我知道googol,googolplex,googolplex等。但我认为这与物理学没有任何联系:)是的,数字是10^100000,也就是1后跟100000个零。猜猜看,这个问题的时间限制是0.1秒另一个重要的Delphi数学网站: