首页 > 编程语言 >快速取模算法(Barrett Reduction)

快速取模算法(Barrett Reduction)

时间:2022-11-25 19:26:06浏览次数:35  
标签:取模 运算 int 算法 模数 Reduction 除法 Barrett

原理:取模运算低效的原因本质是除法运算的低效。如果能将除法变成其它运算就可以加速。具体地,将除以任意数转化成“乘一个数、除以一个2k”(取262即可确保int范围内运算较为精确)。需要使用__int128来进行乘法。

一般来说,模数是常数编译器会优化,速度不会太慢;如果模数不断变化,使用这个也不会加速(构造取模器本身需要除法)。所以如果模数是输入的一个固定数,适合使用该算法。

代码:

struct Mod
{
    LL m, p;
    void init(int pp) { m = (1LL << 62) / pp; p = pp; }
    LL operator ()(LL x)
    {
        LL r = x - ((__int128(x) * m) >> 62) * p;
        return r < 0 ? r+p : (r >= p ? r-p : r);
    }
} mod;

感谢UOJ群老哥教我这个。

标签:取模,运算,int,算法,模数,Reduction,除法,Barrett
From: https://www.cnblogs.com/kyeecccccc/p/16926104.html

相关文章

  • 通用文档信息提取模型浅析
    文章目录​​1.前言与痛点​​​​2.通用信息提取模型技术分析​​​​1.技术介绍​​​​2.原理分析​​​​1.LayoutDetection(视觉检测模块):​​​​2.OCR(文字识别......
  • 快速幂模板 + 快乘模板 + 取模方式
    ​​​​​​​​​​​​​​​​​​​​​​取模,变小(这里减法取模和除法取模需要特别注意)1.加法取模:(A+B)%P=(A%P+B%P)%P;2.乘法取模:(A*B)%......
  • 7.CF438D The Child and Sequence 线段树维护区间取模
    7.CF438DTheChildandSequence线段树维护区间取模给定数列,区间查询和,区间取模,单点修改。记录区间最大值,对于区间最大值小于模数的区间不予更新洛谷传送门:​​CF438DT......
  • LG7521 [省选联考 2021 B 卷] 取模
    LG7521[省选联考2021B卷]取模给定\(n\)个正整数\(a_i\),请你再其中选出三个数\(i,j,k(i\neqj,i\neqk,i\neqk)\),使得\((a_i+a_j)\bmoda_k\)的值最大。复......
  • 计算机取模运算
    一、模的概念模实际指的就是一个范围,下面摘抄自百度百科的一段话:“模”是指一个计量系统的计数范围,如过去计量粮食用的斗、时钟等。计算机也可以看成一个计量机器,因为计......
  • 取模运算优化
    取模优化常见的做法是加法取模转减法,或者积累数据之后一次性取模,不过这些没有真正的加快取模运算,只是减少了取模的运算次数。真正想要把取模做到和加减一样快(\(O(1)\))已......
  • 取模专题
    有理数取质数余求\(\frac{a}{b}\bmodp\)其中\(p\)为质数。费马小定理费马小定理:\(a^{p-1}\equiv1~(\bmodp)\)其中\(p\)为质数。\(\frac{a}{b}\bmodp\)......
  • 如何从3dwarehouse获取模型(非商用)
        这是需要一些模型做练习时,从网上下载的开放模型,非商业应用,否则会被网站追责版权!    3dwarehouse的模型一般都放在谷歌地球上去展示,打开谷歌地球就可以看......
  • 斐波那契数列(取模)
    题目:菲波那契数列是指这样的数列:数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。......
  • modint自动取模
    modint自动取模类模板简单的一种constexprintmod=1e9+7;template<typenameT>Tinv(Ta,Tm){Tu=0,v=1;while(a!=0){Tt=m......