高精度取模-(精品课件).pptVIP

  • 47
  • 0
  • 约1.38千字
  • 约 11页
  • 2018-10-14 发布于广西
  • 举报
高精度模单精度 取模运算相信大家都比较熟悉,但是如何计算一个高精度数模上一个单精度数呢? 举例:45154···545 mod 12,像这样的运算直接模拟着去做可能有点困难。 一个数去模另一个数,比如 456 mod 13 ,是否有另一种办法,不采用456/13求余数的方式呢? 答案是肯定的。 分析思路 456 mod 13 可以写成如下过程: 456=400+50+6 若不看 0 则为 4 , 5 , 6 三位数,这样就把一个很多位数的数字分成了每位都是单独的,在数组中也是这种形式。 我们首先从第一位开始,依次到末尾,如下: ((4%13*10+5)%13*10+6)%13 = 1 ① 这样做为什么可以呢? (400%13+50%13+6%13)%13=1 ② 这样大家都比较明白,因为这是同余定理。 续上 为什么上面的两个式子是等价的? 也许你已经发现①式中有几处*10,若将%13都去除那么①的结果就是456。 这样一来相信那样做的道理就不用我来解释了。 大家思考一下便会理解其中的奥妙。 有了这样的等式高精度模单精度就不成问题了! 参考代码 读入及转换为整型数略。 long ans=0; for(i=1;i=n;i++) ans=(ans*10+a[i])%m; a数组代表高精度数,m代表要模的单精度,ans为最终的结果。 单精度(高精度幂)模单精度 这个标题可能有点不好理解,举例如下: a b mod m ,这是不是快速幂取模的内容,不是,要注意这里的 b 是高精度数,也就是说 b 有可能上百位。但是思想也有快速幂取模中的分治。 那是否就是按照b/2/2…/2的那种形式呢? 因为b为高精度,所以我们尽量避免程序中出现关于高精度的除法,即使是除以单精度。 续上 当然也需要将b化成较小的部分,这种划分是除以10的,如 b=b’ * 10 + r。 那么r代表什么呢? 举个例子便明了了。 159=15*10+9 ,4258=425*10+8 r就代表加上的个位数 , 有10中情况。 分解过程 统一的形式: ab mod m = (ab1 mod m) 10* (ar1 mod m) = … =((abnmod m) 10*(arnmod m)mod m)10*(rn-1modm) …… 红色标记的代表上一层。 具体实现也是要用递归的。 参考代码 long hmod(long a,long k,long m) { if(!k) return s[t[k]]; //边界处理 long i,ans=1,tmp=hmod(a,k-1,m); //进入下一层 for(i=0;i10;i++) ans=ans*tmp%m; //10次方运算 return ans*s[t[k]]%m; //返回这一层的计算结果 } 注释 上述函数是s数组中的值是预处理后的, s[2] = a2 mod m ,所以s数组不需定义太大s[10]就行了。 t数组中是高进度b的每一位数,从0开始。 函数的三个参数a和m不用说了,k代表调用时t数组中的最后一位的位置。 THE END THANK YOU * 高精度模运算

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档