我正在尝试构建一个可以解决模块一致性的C ++程序:
n ^ p = x(mod q),
其中n是一个小数,p和q是非常大的任意素数。我曾尝试多次这样做,但我总是遇到内存溢出问题。任何帮助表示赞赏。
答案 0 :(得分:2)
b ^ e (mod m )有一个简单的算法:
function powerMod(b, e, m)
x := 1
while e > 0
if e % 2 == 1
x := (b * x) % m
b := (b * b) % m
e := e // 2 # integer division
return x
您不计算 b ^ e ,然后执行模运算,因为中间数将是巨大的。我会留给你翻译成你喜欢的语言,数据类型适合存储你需要的大数字。我在my blog讨论了这个算法。
答案 1 :(得分:1)
看看你对你的问题的评论,听起来你正试图将非常大的值推到变量中,这些变量不能保持那么大的值。
在此处查看有关数据类型及其可容纳范围的更多信息:
http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.110).aspx
我发现的非负数的最大数据类型范围是unsigned long long
。它包含从0到18,446,744,073,709,551,615的值范围。