如何找到非常大的模数

这是关于一种查找具有正常小整数的非常大整数的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值