我遇到了一个问题,我需要使用素数找到一个非常大的数字的余数。实际问题是该数字非常大,约为10^100
。所以我们不能将它存储在任何变量中,只有选项是将它存储在数组中。
现在我们需要使用素数(10^9)+7
来查找此数字的剩余部分。
我想不出任何想法,有什么建议吗?
P.S。:编程语言是C ++。
答案 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位就足够了。