BSGS学习笔记
时间:2019-09-06
本文章向大家介绍BSGS学习笔记,主要包括BSGS学习笔记使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
这个算法非常傻逼。
PS:我不会Markdown 数学公式只能这么写,敬请谅解。
用来求高次同余方程:a^x=b(mod p)最小的x
通过费马小定理,我们能得知:a^k=a^(k mod (p-1)) (mod p)
当然,前提是gcd(a,p)>1并且p为质数。
证明:
a^(k mod (p-1))=a^(k-m(p-1))
\frac{a^k}{a^{(p-1)^m}}=a^k (mod p)
显然a^(p-1)^m mod p=1,虽然余数没有可除性,但是应该看得出来这个是成立的
然后我们就把x变成i*m-j
a^m^i=b*a^j(mod p)
枚举j,把右式插入map中,因为j越大,i*m-j越小。所以不考虑重复。
然后再枚举i,将左式的结果再map中查找,第一个就是答案.
推荐一道模板题,SDOI2011计算器,正好复习一下扩欧
code:
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll t,jzsb,y,z,p; void exgcd(ll a,ll b,ll &d,ll &x,ll &y){ if(b==0){ x=1,y=0,d=a; return ; } exgcd(b,a%b,d,x,y); ll t=x;x=y,y=t-(a/b)*y; } map<ll,ll> jyk; ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b); } int main(){ int i; cin>>t>>jzsb; while(t--){ scanf("%lld%lld%lld",&y,&z,&p); if(jzsb==1){ ll res=1; while(z){ if(z&1)res=(res*y)%p; y=(y*y)%p; z>>=1; } printf("%lld\n",res); }if(jzsb==2){ ll d,u,v; exgcd(y,p,d,u,v); if(z%d==0){ printf("%lld\n",(u*(z/d)%(p/d)+(p/d))%(p/d)); }else puts("Orz, I cannot find x!"); }if(jzsb==3){ if(gcd(y,p)>1)puts("Orz, I cannot find x!"); else{ jyk.clear(); ll m=ceil(sqrt(p)),res=z%p,w=1; for(i=0;i<=m;i++){ jyk[res]=i; res=(res*y)%p; if(i>=1)w=(w*y)%p; } ll h=1; int flag=0; for(i=1;i<=m;i++){ h=(h*w)%p; if(jyk[h]){ printf("%lld\n",((i*m-jyk[h])%p+(p))%(p)),flag=1; break; } } if(!flag)puts("Orz, I cannot find x!"); } } } return 0; }
就好了。
原文地址:https://www.cnblogs.com/zbsakioi/p/11478719.html
- Github 项目推荐 | 用于构建端对端对话系统和训练聊天机器人的开源库 —— DeepPavlov
- 我身边的一些数据库事故 (r5笔记第52天)
- 一个清理脚本的改进思路(r5笔记第51天)
- 【专业技术】Python爬虫:抓取手机APP的传输数据
- 海量数据迁移之传输表空间(一) (r5笔记第71天)
- 一条sql语句的改进探索(r5笔记第70天)
- 【专业技术】Node.js 究竟是什么?
- Github 项目推荐 | 用 Pytorch 实现的 WaveNet-Vocoder
- 重启数据库的一场闹剧(r5笔记第68天)
- 【C语言系列】基础语法案例分析(初级篇)
- 一次ORA-00600问题的排查和分析(r5笔记第64、65天)
- SpringMVC入门就这么简单
- pl/sql中的forall简单测试(r5笔记第63天)
- SpringMVC【开发Controller】详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于ssm的客户管理系统
- 牛逼哄哄的Spring是怎么被MyBatis给征服了?
- Flutter如何和Native通信-Android视角
- 面试问倒无数人的Spring事务问题,就被你这样说完了?
- GEO数据挖掘3
- 史上最全Docker初学者命令大全
- 想要学会Spring源码,你必知必会的BeanDefinition原理!
- 你知道Spring中BeanFactoryPostProcessors是如何执行的吗?
- 记一次向Spring官方提交PR的失败经历
- GEO数据挖掘4
- GEO数据挖掘5
- 基于SSM框架的JavaWeb通用权限管理系统
- GEO数据挖掘6
- GEO数据挖掘7
- JavaScript 异步编程