首页 > 其他分享 >非常简易的还原分数方法

非常简易的还原分数方法

时间:2023-07-09 09:26:40浏览次数:28  
标签:分数 pp cb LL 简易 还原 res ca equiv

感谢 @unputdownable

问题简述

给定素数 \(p\),正整数 \(x\) 满足 \(1 \le x < p\),则存在 \(\dfrac{a}{b} \equiv x \pmod p\),即 \(a \equiv bx \pmod p\)。求一组 \(a, b\) 使得 \(\max\{|a|, ||b\}\) 尽可能小。

做法

考虑 \(a = bx + kp\),则可以转写成 \(a = k(p \bmod x) \pmod x\),即 \(\dfrac{a}{k} \equiv (p \bmod x)\)。这是一个子问题,转化形式类似欧几里得算法。顶多迭代 \(\log \min\{a, b\}\) 轮以后 \(x\) 就会变成 \(1\),这时候停止。在每一层我们都能得到一个朴素解 \(\dfrac{x}{1} \equiv x \pmod p\),即 \(a = x, b = 1\);同时从下一层的某个解 \(k\) 还能还原出 唯一对应的 某个当前层的解 \(b = \dfrac{a - kp}{x}\)。这样从下往上不断还原,在最顶层(即原问题)我们可以得到 \(\log\min\{a, b\}\) 个不同的解。注意到实际上并不需要一步一步还原,因为 \(b \equiv x^{-1} \cdot a \pmod p\),而 \(a\) 的数值是不会在传递中改变的,所以在每一层记录朴素解中 \(a\) 的数值(即当前的 \(x\)),在顶层求一次 \(x^{-1}\bmod p\),就能 \(\Theta(\log \min\{a, b\}\)) 地得到这些所有解。求出最小解不需要约分。

接下来证明这样就得到了所有正整数解(负数解一定对应某个正数解,不需要求)。考虑任何一组解,把它带入 \(a = bx + kp\),求出 \(k\),不断传递到下一层。\(a\) 在这个过程中始终不变,而在解变得没有意义(\(k = 0\))之前,\(b\) 一定会变成 \(1\),这个时候就中止。那么从这一层开始向上传递求出的解就是这组解。所以所有解都可以被用这样的方式求出。

代码

LL kpow(LL x, LL k, LL p)
{
    LL r = 1;
    while (k)
    {
        if (k & 1) r = (__int128)r * x % p;
        x = (__int128)x * x % p;
        k >>= 1;
    }
    return r;
}

pair<LL, LL> recover(LL x, LL p)
{
    vector<LL> a;
    LL invx = kpow(x, p - 2, p), pp = p;
    while (x)
    {
        a.push_back(x);
        LL t = x;
        x = p % x;
        p = t;
    }
    pair<LL, LL> res{pp, pp};
    for (auto ca : a)
    {
        LL cb = (__int128)ca * invx % pp;
        ca = min(ca, pp - ca);
        cb = min(cb, pp - cb);
        if (max(res.first, res.second) > max(ca, cb))
            res = {ca, cb};
    }
    return res;
}

标签:分数,pp,cb,LL,简易,还原,res,ca,equiv
From: https://www.cnblogs.com/kyeecccccc/p/17538296.html

相关文章

  • 从零用python flask框架写一个简易的网站
    要用Python写一个网站,你可以使用Python的Web框架来开发。常见的PythonWeb框架包括Django、Flask、Bottle等。以下是一个简单的使用Flask框架开发的示例。1.安装Flask在开始开发之前,你需要安装Flask框架。你可以使用以下命令来安装:pipinstallflask2.创建Flask应用在安装......
  • 简易计算机
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=devic......
  • POJ 2976:Dropping tests 01 分数规划
    DroppingtestsTimeLimit: 1000MS MemoryLimit: 65536KTotalSubmissions: 12291 Accepted: 4293DescriptionInacertaincourse,youtake n tests.Ifyouget ai outof bi questionscorrectontest i,yourcumulativeaverageisdefinedtobe.Gi......
  • mssql执行大文件 还原数据库
     解决脚本还原数据库文件过大,打开卡顿问题1、打开MSSQL安装路径:找到MicrosoftSQLServerManagementStudio的图标,点击右键属性>打开文件位置2、在安装路径下打开cmd控制台3、输入命令:C:\ProgramFiles(x86)\MicrosoftSQLServerManagementStudio18\Common7\IDE>sqlcm......
  • 你大脑中的画面,现在可以高清还原了
    前言 AI直接把你脑中的创意画出来的时刻,已经到来了。本文转载自机器之心仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署框架最全教程整理【CV技术指南】CV全栈指......
  • 面试常问集锦——MySQL部分数据库的隔离级别
    聚集索引与非聚集索引的区别https://zhuanlan.zhihu.com/p/113917726Myisam引擎采用非聚集索引,索引与数据分开,叶子结点存放数据的地址。Innodb采用聚集索引,主键索引树的叶子结点存放真实数据,非主键索引树的叶子结点存放主键值索引底层的实现,为什么不选红黑树、B树等?总结(1)哈希表 ......
  • Docker 数据卷的备份和还原
    数据备份方法:dockerrun--volumes-from[containername]-v$(pwd):/backupcentostarczvf/backup/backup.tar[containerdatavolume]例子:dockerrun--volumes-fromdata-volume2-v/root/backup:/backup--namedatavolume-copycentostarzcvf/backup/data-volume......
  • Python爬虫简易教程
    步骤1.获取编程软件Python3Pycharm社区版(可选,更方便代码编辑)Python软件包requestsselenium requests和selenium的区别对于“xxx.html”类型地址的网页,他们的内容是静态的,这种网站一般不会做防护,可以直接用requests爬。其他类型的内容用selenium更节省时间一点。除......
  • 1.4 编写简易ShellCode弹窗
    在前面的章节中相信读者已经学会了使用Metasploit工具生成自己的ShellCode代码片段了,本章将继续深入探索关于ShellCode的相关知识体系,ShellCode通常是指一个原始的可执行代码的有效载荷,攻击者通常会使用这段代码来获得被攻陷系统上的交互Shell的访问权限,而现在用于描述一段自包含......
  • 使用MySQL Shell备份和还原MySQL
    MySQLShell是MySQL的高级客户端和代码编辑器。除了提供的SQL功能之外,与MySQL类似,MySQLShell还为JavaScript和Python提供脚本功能,并包含用于使用MySQL的API。XDevAPI使用户能够处理关系型和文档数据,强烈建议MySQLServer8.0和5.7与MySQLShell8.0一起使用。MySQLShell包含用......