使用素数保留非常大的数字

时间:2013-03-09 06:40:49

标签: algorithm math

我遇到了一个问题,我需要使用素数找到一个非常大的数字的余数。实际问题是该数字非常大,约为10^100。所以我们不能将它存储在任何变量中,只有选项是将它存储在数组中。

现在我们需要使用素数(10^9)+7来查找此数字的剩余部分。

我想不出任何想法,有什么建议吗?

P.S。:编程语言是C ++。

3 个答案:

答案 0 :(得分:2)

用什么编程语言? C / C ++,Java,PHP,Perl,JavaScript ......都有某种形式的Big Integer,允许你将整数设置为以null结尾的字符串的最大长度。实际语法取决于语言,但类似于:

$num = new BigInt("1234567891234567912346579865432165498765462132165498765431");
$prime = new BigInt("54657613216846346874321638743");
$mod = $num.mod($prime);

答案 1 :(得分:2)

总的来说,我会利用这个事实

a^n mod b == (a mod b)^n mod b

所以在这个例子中,你可以计算

= 10^100 mod 10^9 + 7 = (10^10 mod 10^9 + 7)^10  mod 10^9 + 7

= (999999937) ^ 10 mod 10^9 + 7
= ((999999937) ^ 2 mod 10^9 + 7) ^ 5 mod 10^9 + 7
= 4900 ^ 5 mod 10^9 +7
= 226732710

答案 2 :(得分:2)

可以通过以下方式从其数字构建十进制数字(例如1234):

x=1;
x=x*10+2;
x=x*10+3;
x=x*10+4;//x=1234

(你从最重要的数字开始,每次都拿下一个数字。)

由于加法和乘法允许将模数运算移入其中,因此您可以在每一步上简单地应用模数(例如7):

x=1;
x=(x*10+2)%7;
x=(x*10+3)%7;
x=(x*10+4)%7;//x=1234%7

如果你的素数大约是10 ^ 9,32位整数是不够的,但64位就足够了。