用于求\(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学习笔记的更多相关文章

  1. 大步小步法(BSGS) 学习笔记

    \(\\\) BSGS 用于求解关于 \(x\) 的方程: \[ a^x\equiv b\pmod p\ ,\ (p,a)=1 \] 一般求解的是模意义下的指数,也就是最小非负整数解. \(\\\) ...

  2. BSGS 学习笔记

    问题:求$a^x\equiv b\ (mod\ p)$的最小正整数解. 这时候就要用到BSGS(拔山盖世)算法.直接进入正题: 设$x=im-n$, 则原式等于$a^{im-n}\equiv b\ ( ...

  3. 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)

    注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...

  4. OI数学 简单学习笔记

    基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...

  5. OI知识点|NOIP考点|省选考点|教程与学习笔记合集

    点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...

  6. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  7. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  8. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  9. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

随机推荐

  1. Debian使用小计

    1. Debian无法apt install debian安装完成后,如果运行apt install,提示 Media change: please insert the disc labeled ' ...

  2. HTML5微信jssdk录音播放语音的方法

    HTML5微信jssdk录音播放语音的方法需要注意的2个问题1 就是一定要判断1秒内 录音都不算 ps:太短不能录音 2 录音超过1分钟 会发现正在录音突然消失 所以要写wx.onVoiceRecor ...

  3. Linux 中mysql安装(源码安装方式)

    本文是介绍以源码安装的方式编译和安装Mysql 5.6(可以指定安装路径),也可以不采用源码安装方式,直接用安装包的方式. 源码安装方式慎用,容易报错. 1.卸载旧版本 rpm -qa | grep ...

  4. Python批量更改文件名

    一.问题在处理文件或者一些其他信息的时候我们需要更改文件名,那么我们可以写一个程序来修改这些文件名,以减少我们重复的做一件事. 二.解决本次使用的Python,利用的是Python中的OS模块,具体操 ...

  5. Kafka学习笔记之如何永久删除Kafka的Topic

    0x00 问题描述 使用kafka-topics --delete命令删除topic时并没有真正的删除,而是把topic标记为:“marked for deletion”,导致重新创建相同名称的Top ...

  6. Git 管理版本/回退

    参考链接:https://www.liaoxuefeng.com/wiki/896043488029600/896954074659008 Git status命令可以让我们时刻掌握仓库当前的状态,比 ...

  7. 简单了解Eureka

    1.Eureka简介 Eureka是Spring Cloud Netflix微服务套件中的一部分,是一套成熟的服务注册和发现组件,可以与Springboot构建的微服务很容易的整合起来. Eureka ...

  8. 2019-07-31 Jquery

    Jquery是什么? jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是“ ...

  9. 【转载】C#使用InsertRange方法往ArrayList集合指定位置插入另一个集合

    在C#的编程开发中,ArrayList集合是一个常用的非泛型类集合,ArrayList集合可存储多种数据类型的对象.在实际的开发过程中,我们可以使用InsertRange方法在ArrayList集合指 ...

  10. kubernetes V1.16 Ingress-nginx部署

    Ingress 在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的.为了使外部的应用能够访问集群内的服务,在Kubernetes中可以通过NodePo ...