最少的非负残留:大数

时间:2013-06-11 22:14:43

标签: c++ primes modular-arithmetic

我正在尝试构建一个可以解决模块一致性的C ++程序:

  

n ^ p = x(mod q),

其中n是一个小数,p和q是非常大的任意素数。我曾尝试多次这样做,但我总是遇到内存溢出问题。任何帮助表示赞赏。

2 个答案:

答案 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的值范围。