2024.10.16 鲜花

news/2024/10/21 16:16:39
PRAGMATISM -RESURRECTION

凭什么没词就不是好歌!!!

取模优化

就不讲怎么减少取模了。

比较广为流传的有两种,Barrett reduction,Montgomery Algorithm。

对于固定常数模数,计算机已经优化的很好了,一般不会有太大效果(确实有,用 Barrett reduction 有时可以卡常)。

对于输入的固定模数(即不会改变),可以用一下算法优化。

Barrett reduction:

一句话总结,比较有用,比较好写

考虑对于 \(a\bmod m\),可以用 \(a-m\lfloor \frac{a}{m}\rfloor\),但是直接计算 \(\lfloor \frac{a}{m}\rfloor\),由于除法的常数,并不会快。

众所周知,不能精确计算的就粗略计算,考虑除以 \(2^k\) 是快的,因为可以用位运算,于是我们考虑将 \(\lfloor \frac{a}{m}\rfloor\) 用除以 \(2^k\) 估算。

具体的,设 \(base=\lfloor \frac{2^k}{m} \rfloor\),于是 \(\lfloor \frac{a}{m}\rfloor\) 可以粗略计算为 \(\lfloor \frac{base*a}{2^k}\rfloor\)

优点是简洁好写,缺点是有一定错误率,且需要用 __int128

错误率:显然,\(\lfloor \frac{base*a}{2^k}\rfloor \le \lfloor \frac{2^k}{m} \rfloor\) 对于 \(k\)\(64\) 时,\(m\)\(10^9\) 左右的模数,极限值域在 \(10^{18}\) 时,用 __uint128_t 存储 \(base\),在测试了 \(10^{10}\) 组纯随机数据中,\(\lfloor \frac{2^k}{m} \rfloor - \lfloor \frac{base*a}{2^k}\rfloor \le 1\),可以加上判断来减掉误差(虽然会变慢)。

Montgomery Algorithm:

一句话总结,卵用没有。

考虑对于加减法,显然可以用判断来代替取模,对于乘法(\(ab \bmod m\)),我们考虑优化。

这里我们需要 \(m\perp 2\)

\(R=2^k > m,a'=aR \bmod m,b'=bR \bmod m\)

显然有 \(abR \equiv a'b'R^{-1} \pmod m,a'R^{-1}\equiv aR^2 \pmod m,b'R^{-1}\equiv bR^2 \pmod m\),而 \(R^2 \bmod m\) 是可以预处理的,所以我们只要能够快速求出 \(xR^{-1}\bmod m\) 就可以快速求出 \(a',b'\),进而求出 \(abR,ab\)

如何求出 \(xR^{-1}\) ,考虑求最小的 \(k\) 满足 \(R | x+km\),在将 \(R\) 除掉即可,\(k\pmod -xm^{-1} \pmod R\),提前处理 \(m^{-1} \bmod R\)即可。

优点是不用 __int128,并且实现精细的话可能更快,缺点是必须精细实现,要封装 \(modint\) 来减少转换,细节较多(反正我调了一下午还不如本地动态模数暴力快,提交比固定模数略慢)。

唯一的作用没准就是做模板题 at_arc148_f。

速度测试以后会补,有简单的本地评价: Barrett reduction 未加判断。

固定模数: \(默认=Barrett reduction<Montgomery Algorithm\)

非固定数: \(Barrett reduction<默认<Montgomery Algorithm\)

学校 OJ 上固定模数 Montgomery Algorithm 略慢于默认,Barrett reduction 快于默认。

Barrett reduction,Montgomery Algorithm 都不会受模数是否固定影响。

P


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/72431.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

每日学学Java开发规范,集合处理(附阿里巴巴Java开发手册(终极版))

前言 每次去不同的公司,码不同的代码,适应不同的规范,经常被老大教育规范问题,我都有点走火入魔的感觉,还是要去看看阿里巴巴Java开发规范,从中熟悉一下,纠正自己,码出高效,码出质量。 想细看的可以去官网下载,或者下面自取 阿里巴巴Java开发手册(终极版) 五、集合…

element-plus框架样式设置不生效

问题:在element-plus的菜单组件中,二级菜单折叠,然后鼠标悬浮的时候,出现的内容是有内边距,我想去掉,如图:但是在控制台找到了相应的类,需要把padding设置为0。我通过如下代码设置不生效,原因:可能是生成的二级菜单样式里面没有带特定的hash属性 而vue代码里面样式里…

IDEA如何进行阿里巴巴编码规约扫描并导出报告

前言 我们在使用IDEA开发Java应用时,可以安装很多的插件来帮助我们高效的开发代码。 我们需要注意开发的编码规范,这时候就可以安装一款很有名的插件,阿里巴巴的编码规约插件。可以用这个插件,对我们的代码进行扫描,并且导出报告,那么我们应该怎么操作呢? 如何扫描代码并…

Java 集成阿里云发送短信

首先要有个阿里云账号,可到阿里云登录页注册并登录。 登录后访问短信服务快速学习和测试,其中有逐步介绍如何发送短信:新增资质 新增资质相当于进行实名认证,资质是申请签名的实名化信息。申请签名 签名是短信中能代表发送者属性的字段。一般就是公司名字。发送短信时,签名…

计量经济学(七)——时间序列GARCH模型

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 金融市场中的波动性建模是金融计量经济学的重要研究内容。时间序列数据,尤其是金融市场数据,往往表现出强烈的波动聚集现象,这意味着波动率在某些时期较高…

IDEA如何打开左右两个窗口方便代码对比

前言 我们在使用IDEA开发时,有时候会遇到一个问题,就是我们会想复制一个文件里面的好几处内容到另外一个文件中。但是这样会频繁的切换两个文件,也不太方便。这时,我们就可以用IDEA左右分别打开两个文件,左右对比着看。那么,我们应该如何操作呢? 如何操作 首先,我们把我…

Byteland, Berland and Disputed Cities

算法 贪心总结 对于最优非 dp 策略题 考虑分多钟可能的情况求最小值, 而不是死去推 dp

数据采集第一次作业

作业①: 要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020)的数据,屏幕打印爬取的大学排名信息。 实现关键代码:点击查看代码 response = urllib.request.urlopen(url) html = response.read()# 使用BeautifulSou…