[Tricks-00008]浅谈取模技巧

news/2025/1/31 20:28:38/文章来源:https://www.cnblogs.com/maihe/p/18695900

取模从古以来就是一个难题。

比如有一个数 \(p\),和两个数 \(0\leq x,y<p\),计算 \((xy\bmod p)\)。暴力做除法的复杂度是 \(O(\dfrac{\log x\log p}{w})\),这里请注意。高精度乘除的复杂度是不同的,这是因为乘法可以把两边都压位,而除法必须枚举一个。接下来,我们介绍 Montgomery 形式,不仅可以优化取模,还能干其它事。

有函数 \(R(x)\),定义域是 \([0,p)\),返回 \(xr\bmod p\)\(R'(x)\),定义域是 \([0,p^2)\),返回 \(\dfrac{x}{r}\bmod p\),注意它们的值域都是 \([0,p)\),可是定义域不同,因此它们并不互为反函数。

如何求 \(R'(x)\)

答:设 \(\dfrac{x}{r}\equiv t\bmod p\),则 \(x\equiv tr\bmod p\)。改写为 \(x=tr+kp\)。你现在要求出一个 \([0,p)\)\(t\)

换模数(这也是数论问题常见的处理技巧?),改为两边同时 \(\bmod r\),则 \(kp\equiv x\bmod r\),解得 \(k=(xp^{-1}\bmod r)\)

这样我们得到了一个 \([0,r)\)\(k\)。又知 \(t=\dfrac{x-kp}{r}\)\(x\in [0,p^2)\),所以有 \(|t|<\dfrac{p^2+rp}{r}\)

请注意,刚才我们并没有说 \(r\) 是几。但是从中可以看出特点:要好求逆(也说明要和 \(p\) 互素,这里 \(p\) 必须是质数),且 \(r>p\)。最好的办法是让 \(r\) 取成一个 \(2^{2^q}\) 形式。则 \(-p<t<2p\),稍作修改即可将 \(t\) reduce 为 \([0,p)\) 的数。取模关键部分在这里。

下一个问题:如何求 \(R(x)\)

因为 \(x\equiv \dfrac{xr^2}{r}\bmod p\),所以改为算 \(R'(xz)\) 即可,其中 \(z=(r^2\bmod p)\),可以预处理!

请注意,下面要说一个关键点。我们从此考虑那些运算时,不要 再把那些原来的 \(x\) 带入计算了,通通改成 \(R(x)\)。这为什么是可行的?

第一点:\(R(x\pm y)=R(x)\pm R(y)\),reduce 是极其容易的。

第二点:\(R(xy)\equiv\dfrac{R(x)R(y)}{r}\bmod p\),因此有 \(R(xy)=R'(R(x)R(y))\)。这里注意 \(R'\) 的定义域可以有平方,因此直接一个乘法一个 reduce 就好了。

第三点:也就是最后怎么还原?其实也非常容易:\(x=R'(R(x))\)

于是就赢麻了。假如我们高精度都是在 \(2\) 进制意义下计算,则对一个 \(2\) 的次幂取模是轻松的(大概相当于 resize)。最后一个问题,计算一个奇数在 \(\bmod 2^{2^q}\) 意义下的逆元。

这东西像不像多项式求逆?没错,牛顿迭代即可。

设要求出 \(a\) 的逆元,已经有的数是 \(b\),每轮 \(b\leftarrow 2b-b^2a\) 即可。因为倍增,所以这部分复杂度 \(O(\dfrac{\log^2 p}{w^2})\),很可能不足以成为复杂度瓶颈。

每次取模的复杂度降为了 \(O(\dfrac{\log^2 p}{w^2}\))。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

05. 用户组管理

一、什么是用户组管理每一个用户都有一个用户组,系统可以对一个用户组的所有用户进行集中管理。不同 Linux 系统对用户组的规定有所不同。Linux 下的用户属于与它同名的用户组,这个用户组在创建用户时同步创建。用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修…

华为mate70pro+ 对比 小米10ultra 高像素模式

华为 拍摄一张大概要5-7秒 小米 只需不到1秒 华为明显要强华为小米 华为小米

Qt Quick与ROS通过UDP协议实现网络通信

实现目标 项目需要编写一个无人机地面站,无人机在ROS系统下运行,地面站需要与无人机建立通信,能够控制无人机起飞、降落、飞行,并能够接收无人机的状态信息。 该无人机系统的组成如下图所示:地面站通过无线网络与无人机上位机建立通信,上位机负责将飞控的无人机状态数据转…

5.C++提高编程

C++提高编程。C++提高编程 本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用 1 模板 1.1 模板的概念 模板就是建立通用的模具,大大提高复用性 例如生活中的模板 一寸照片模板:PPT模板:模板的特点: 模板不可以直接使用,它只是一个框架 模板的通用并不是…

又来新活了!AI电商搜索,或是下一个90亿美元独角兽?

全新体验,大模型驱动的对话式购物搜索。图源:https://www.shopencore.ai/ 全新体验,大模型驱动的对话式购物搜索。 Encore, 由2024年10月成立的美国初创公司开发。定位于二手商品对话式购物搜索,最终目标为个人购物助理。 2024年12月3日获得YC(Y combinator)的50万美元天使…

qq网页版下载音乐教程

点一首音乐开始播放,务必要播放界面内只有一首音乐,然后f12调试,找到audio标签;然后复制src=”” 双引号内的内容到新标签打开,然后在播放栏,右键,就可以保存音乐了,注意有的音乐是m4a格式,下载完成后还要转换成mp3。谢雨尘安-谢雨尘安的博客

gin: 校验参数时返回自定义错误信息

一,代码 1,global/validator.go package globalimport "github.com/go-playground/validator/v10"//存放GetMessages()方法 type Validator interface {GetMessages() ValidatorMessages }//校验信息 type ValidatorMessages map[string]string// GetErrorMsg方法,…

VM笔记_Modbus通信触发流程

1,通信触发流程 ①通信配置② 接收事件新建③全局触发-事件触发4, 通信心跳配置和启用5, 效果展示

[SWPUCTF 2021 新生赛]easyupload3.0 Writeup

题目来源:NSSCTF 题目方向:Web 题目类型:文件上传 2.0的做法和1.0相同,不过用.phtml绕过就行 1.这里去了解了一下.htaccess文件: htaccess文件是Apache服务中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮助我们实现:网页301重定向、自定义404错…

数据库性能调优中的配置参数调整:提升系统效率的关键环节

title: 数据库性能调优中的配置参数调整:提升系统效率的关键环节 date: 2025/1/31 updated: 2025/1/31 author: cmdragon excerpt: 数据库的性能直接影响到应用程序的响应能力和用户体验,因此在日常运维中,管理员需要定期对数据库系统进行性能调优。配置参数调整是数据库性…

PID 温控设计(基于 STC51)

PID 温控设计(基于 STC51) 一、需求分析 开关型控制存在的问题:加热的过程是全功率加热,三极管发热量大,温度控制振荡幅度大,控制精度较低。而通过采用PID方法能够更加精确地控制加热片处于目标温度,并在一个较小范围内浮动。精度要求:0.2℃ 温控范围 目标温度:45℃ 温…

gin: 接收参数时校验

一,安装第三方库: $ go get -u github.com/go-playground/validator/v10 go: downloading github.com/go-playground/validator/v10 v10.24.0 go: downloading github.com/gabriel-vasile/mimetype v1.4.8 go: downloading golang.org/x/crypto v0.32.0 go: downloading golan…