这是关于一种查找具有正常小整数的非常大整数的mod的技术。
我最近在需要计算具有正整数的非常大的模数时遇到了这个问题。 我在32位UNIX平台上运行的C ++程序中需要此功能。 问题在于数字长度为28位,并且c ++中没有任何本机数据类型可以存储该大小的数字。
(例如:1088263455689473669888943602%380)
甚至没有签名的long long或long double都没有帮助; 它们都是8bytes。
我发现可以通过以下方式完成此操作。
解决方案-分而治之:整个数字不必一口气处理。 在这种情况下,可以使用分而治之的策略。 将数字分成较小的数字; 找到这些较小数字的余数。 将余数相加并重复该过程。 只要保留其余部分,最终答案就不会改变。
假设您需要找到nBig%a
1)取输入大数nBig的可管理部分(例如x),并将其从nBig中减去(nBig = nBig-x)
2)计算x的mod(mod = x%a)
3)将mod添加到nBig(nBig = nBig + mod)
这样,可以减少数量nBig而不影响实际答案。
例如:要找到27%8:
1)令x = 17.因此nBig = nBig-x = 27-17 = 10
2)mod = x%a = 17%8 = 1
3)nBig = nBig + mod = 10 +1 = 11
因此nBig从27减少到11,而不会影响答案3。
寻找大量的mod:扩展相同的逻辑,可以解决以下问题:
让输入为:
nBig:代表30位大数字的字符串(例如:“ 123456789033333333333335555555555”)
a:整数(例如320)
要找到nBig%a:
迭代1:1)从nBig的LHS中提取一些数字。
因此,tmp = 1234567890和nBig =“ 33333333335555555555”
2)找到tmp的mod。
mod = tmp%a = 210
3)前缀mod为nBig。
nBig =“ 21033333333335555555555”
现在重复上述步骤:
迭代2:1)tmp = 2103333333和nBig =“ 3335555555555”
2)mod = tmp%a = 213
3)nBig =“ 2133335555555555”
迭代3:1)tmp = 2133335555和nBig =“ 555555”
2)mod = tmp%a = 195
3)nBig =“ 195555555”
迭代4:1)tmp = 195555555和nBig =“”
2)mod = tmp%a = 35
答案= 35个 伪代码:要找到nBig%a:
令d =一次可以处理的位数。
在val(nBig)> = a时重复
1. tmpStr:=来自nBig的LHS的d位。
2. nBig:= nBig的剩余部分
3. tmpNum:= toInteger(tmpStr)
4. tmpNum:= tmpNum%a
5. tmpStr:= toString(tmpNum)
6. nBig:= tmpStr + nBig
选择d:d应满足以下约束
最大编号 Mod a <d <= max中的位数。 tmpNum中的位数-最大编号 Mod a中的位数
(例如:如果a = 512(Mod范围为0..511),并且tmpNum最多可以存储16位数字,则
3 <d <= 16-3)
(例如:如果a = 100(Mod范围为0..99),并且tmpNum最多可以存储16位数字,则
2 <d <= 16-2)
From: https://bytes.com/topic/software-development/insights/793965-how-find-modulus-very-large-number