BSGS学习笔记
用于求\(A^{x} \equiv B \pmod{C}\) 高次方程的最小正整数解x,其中C为素数
引理1:$a^{i\mod\varphi(p) } \equiv a^{i} $ (mod p) p为素数,即\(a^i\)在模p的意义下会出现循环节(注:\(\varphi(p)\)不是最小循环节)
证明:
因为$ a^{p-1} \equiv 1 $ (mod p) (费马小定理) ,则 \(a^{k*(p-1)} \equiv 1\) (mod p)
所以$ a^{2k * (p-1)} * a^{-k * (p-1)} \equiv 1 $ (mod p)
所以$ a^{2k * (p-1)} $ 为 \(a^{-k * (p-1)}\) mod p意义下的逆元
$ \frac{a{i}}{a{k * (p-1)}} \equiv a^{i} * a^{2k * (p-1)} \equiv a^{i} * 1 \equiv a^{i} $ (mod p)
即$ a^{i-k*(p-1)} \equiv a^{i} $ (mod p)
又因为$ i \bmod \varphi(p) = i-k*(p-1) $
且p为素数,\(i-k*(p-1)=i-k * \varphi(p)\)
则$ a^{i-k*(p-1)} \equiv a^{i\mod\varphi(p)} \equiv a^{i} $ (mod p)
证毕!
根据引理1我们可知只需要枚举至多\(\varphi(C)\)个数就能知道方程的解,若枚举完后发现无解,则整个方程无解
考虑构造一个m,使得\(m=ceil(\sqrt{C})\) (其中ceil()为向上取整函数)
\(x=k*m-q\),原方程转化为$ A^{k * m-q} \equiv B \pmod{p}$
继续得到 $ A^{k * m} \equiv B*A^{q} \pmod{p}$
BSGS流程:到了这一步,我们先考虑枚举\(B*A^{q}\)中的q,至多\(\sqrt{C}\)次,然后我们把得到的值存入一个Hash表中
接着我们开始枚举 $ A^{k * m}$ 中的m,则两次枚举出来的式子的两两组合正好可以得到所有$range \in [1,x] $(作者就是被这个地方卡了一万年QwQ),若遇到两次枚举出来的值相等,则输出答案,退出循环。
(注:作者写这题的时候运势不好,Hash写挂了,换成了map,效果不影响)
Code:
#include<stdio.h>
#include<math.h>
#include<map>
using namespace std;
#define ll long long
#define int ll
#define HASH_MOD 76799777LL
map<int,int> hash;
ll qpow(ll A,ll B,ll C){
if(B==0) return 1;
if(B==1) return A;
ll t=qpow(A,B>>1,C);
t=t*t%C;
if(B&1) t=t*A%C;
return t;
}
ll BSGS(ll A,ll B,ll C){
const int sizes=ceil(sqrt(C));
ll base=B%C;
hash[base]=0;
for(int i=1;i<=sizes;i++){
base=base*A%C;
hash[base]=i;
}
base=qpow(A,sizes,C);
ll tmp=1;
for(ll i=1;i<=sizes;i++){
tmp=tmp*base%C;
if(hash[tmp])
return ((i*sizes-hash[tmp])%C+C)%C;
}
return -1;
}
ll P,B,N;
signed main(){
scanf("%lld%lld%lld",&P,&B,&N);
if(!(B%P)){
printf("no solution\n");
return 0;
}
ll ans=BSGS(B,N,P);
if(ans!=-1) printf("%lld",ans);
else printf("no solution");
}
BSGS学习笔记的更多相关文章
- 大步小步法(BSGS) 学习笔记
\(\\\) BSGS 用于求解关于 \(x\) 的方程: \[ a^x\equiv b\pmod p\ ,\ (p,a)=1 \] 一般求解的是模意义下的指数,也就是最小非负整数解. \(\\\) ...
- BSGS 学习笔记
问题:求$a^x\equiv b\ (mod\ p)$的最小正整数解. 这时候就要用到BSGS(拔山盖世)算法.直接进入正题: 设$x=im-n$, 则原式等于$a^{im-n}\equiv b\ ( ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- OI数学 简单学习笔记
基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...
- OI知识点|NOIP考点|省选考点|教程与学习笔记合集
点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
随机推荐
- 每日一问:LayoutParams 你知道多少?
前面的文章中着重讲解了 View 的测量流程.其中我提到了一句非常重要的话:View 的测量匡高是由父控件的 MeasureSpec 和 View 自身的 `LayoutParams 共同决定的.我们 ...
- jvm参数设置实例
- 【Gamma】“北航社团帮”发布说明——小程序v3.0
目录 Gamma版本新功能 小程序v3.0新功能 新功能列表 新功能展示 这一版修复的缺陷 Gamma版本的已知问题和限制 小程序端 网页端 运行.安装与发布 运行环境的要求 安装与发布 小程序 网页 ...
- django orm 外键id返回对应的名称
原文:https://blog.csdn.net/gghhm/article/details/99652143 当我们在写django的orm模块时,有时候会在用外键关联时,保存的是对应表中的id字段 ...
- 【IntelliJ IDEA学习之六】IntelliJ IDEA 调试
版本:IntelliJIDEA2018.1.4 一.设置热部署1.自动编译 2.配置hotswap 3.开启compiler.automake.allow.when.app.running CTRL ...
- 透彻的掌握 Spring 中@transactional 的使用
事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编码式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP ...
- protobuf, python Enum
继承enum.Enum的python class,其实是一个, name-value的关系,可以直接className(value)得到一个类.比如 import enum class xx(enum ...
- 【chromium】 渲染显示相关概念
DRM(Direct Rendering Manager) DRM 由两个部分组成:一是 Kernel 的子系统,这个子系统对硬件 GPU 操作进行了一层框架封装.二是提供了一个 libdrm 库,里 ...
- Xgboost GPU配置
眼残cmake版本配错了搞了半天,简单记录一下,老规矩,参考一下官方的文档. git clone --recursive https://github.com/dmlc/xgboost cd xgbo ...
- java运算符的优先级别
一.运算符的优先级 运算符按照优先级别的高低排序分别是:自加/减运算符. 算术运算符.比较运算符.逻辑运算符.赋值运算符.具体请参考下表: 顺序 运算符 1. 括号,如 ( ) 和 [ ] 2. 一元 ...