2024.10.16 鲜花
PRAGMATISM -RESURRECTION
凭什么没词就不是好歌!!!
取模优化
就不讲怎么减少取模了。
比较广为流传的有两种,Barrett reduction,Montgomery Algorithm。
对于固定常数模数,计算机已经优化的很好了,一般不会有太大效果(确实有,用 Barrett reduction 有时可以卡常)。
对于输入的固定模数(即不会改变),可以用一下算法优化。
Barrett reduction:
一句话总结,比较有用,比较好写
考虑对于
众所周知,不能精确计算的就粗略计算,考虑除以
具体的,设
优点是简洁好写,缺点是有一定错误率,且需要用 __int128
。
错误率:显然,__uint128_t
存储
Montgomery Algorithm:
一句话总结,卵用没有。
考虑对于加减法,显然可以用判断来代替取模,对于乘法(
这里我们需要
设
显然有
如何求出
优点是不用 __int128
,并且实现精细的话可能更快,缺点是必须精细实现,要封装
唯一的作用没准就是做模板题 at_arc148_f。
速度测试以后会补,有简单的本地评价: Barrett reduction 未加判断。
固定模数:
非固定数:
学校 OJ 上固定模数 Montgomery Algorithm 略慢于默认,Barrett reduction 略快于默认。
Barrett reduction,Montgomery Algorithm 都不会受模数是否固定影响。
Upd:
给一个板子:
Mbs = (__int128(1) << 64) / MOD; // init int Mod(int x){ return (x -= ((__int128(x) * m) >> 64) * MOD) >= MOD ? x - MOD : x; }
P
本文来自博客园,作者:5k_sync_closer,转载请注明原文链接:https://www.cnblogs.com/xrlong/p/18470908
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了