扩展BSGS求解离散对数问题
扩展BSGS用于求解axΞb mod(n) 同余方程中gcd(a,n)≠1的情况
基本思路,将原方程转化为a与n互质的情况后再套用普通的BSGS求解即可
- const int maxint=((1<<30)-1)*2+1;
- struct Hashmap{
- static const int Ha=999917,maxe=46340;
- int E,lnk[Ha],son[maxe+5],nxt[maxe+5],w[maxe+5];
- int top,stk[maxe+5];
- void clear() {E=0;while(top) lnk[stk[top--]]=0;}
- void Add(int x,int y){son[++E]=y;nxt[E]=lnk[x];w[E]=maxint;lnk[x]=E;}
- bool count(int y)
- {
- int x=y%Ha;
- for(int j=lnk[x];j;j=nxt[j])
- if(y==son[j]) return true;
- return false;
- }
- int& operator [] (int y)
- {
- int x=y%Ha;
- for(int j=lnk[x];j;j=nxt[j])
- if(y==son[j]) return w[j];
- Add(x,y);stk[++top]=x;return w[E];
- }
- };
- Hashmap f;
- int gcd(int a,int b){
- if(!b) return a;
- else return gcd(b,a%b);
- }
- int exgcd(int a,int b,int &x,int &y)
- {
- if(!b) {x=1;y=0;return a;}
- int r=exgcd(b,a%b,x,y),t=x;
- x=y;y=t-(a/b)*y;
- return r;
- }
- int exBSGS(int A,int B,int C)
- {
- if(C==1) if(!B) return A!=1;else return -1;
- if(B==1) if(A) return 0;else return -1;
- if(A%C==0) if(!B) return 1;else return -1;
- int r,D=1,num=0;
- while((r=gcd(A,C))>1)
- {
- if(B%r) return -1;num++;
- B/=r;C/=r;D=((ll)D*A/r)%C;
- }
- for(int i=0,now=1;i<num;i++,now=((ll)now*A)%C)
- {
- if(now==B) return i;
- }
- int m=ceil(sqrt(C)),Base=1;f.clear();
- for(int i=0;i<=m-1;i++)
- {
- f[Base]=min(f[Base],i);
- Base=((ll)Base*A)%C;
- }
- for(int i=0;i<=m-1;i++)
- {
- int x,y,r=exgcd(D,C,x,y);
- x=((ll)x*B%C+C)%C;
- if(f.count(x)) return i*m+f[x]+num;
- D=((ll)D*Base)%C;
- }
- return -1;
- }
扩展BSGS求解离散对数问题的更多相关文章
- BSGS求解离散对数问题
离散对数问题是求解axΞb mod(n) 同余方程 以下模板使用于gcd(a,n)=1的情况 ; int hs[mod],head[mod],Next[mod],id[mod],top; void i ...
- BSGS与扩展BSGS
BSGS \(BSGS\)算法又称大步小步\((Baby-Step-Giant-Step)\)算法 \(BSGS\)算法主要用于解以下同余方程 \[A^x\equiv B(mod\ p)\]其中\(( ...
- BSGS&扩展BSGS
BSGS 给定\(a,b,p\),求\(x\)使得\(a^x\equiv b \pmod p\),或者说明不存在\(x\) 只能求\(\gcd(a,p)=1\)的情况 有一个结论:如果有解则必然存在\ ...
- POJ 3243 Clever Y 扩展BSGS
http://poj.org/problem?id=3243 这道题的输入数据输入后需要将a和b都%p https://blog.csdn.net/zzkksunboy/article/details ...
- bzoj 3283 扩展BSGS + 快速阶乘
T2 扩展BSGS T3 快速阶乘 给定整数n,质数p和正整数c,求整数s和b,满足n! / pb = s mod pc 考虑每次取出floor(n/p)个p因子,然后将问题转化为子问题. /*** ...
- BSGS和扩展BSGS
BSGS: 求合法的\(x\)使得\(a ^ x \quad mod \quad p = b\) 先暴力预处理出\(a^0,a^1,a^2.....a^{\sqrt{p}}\) 然后把这些都存在map ...
- POJ - 2115 C Looooops(扩展欧几里德求解模线性方程(线性同余方程))
d.对于这个循环, for (variable = A; variable != B; variable += C) statement; 给出A,B,C,求在k位存储系统下的循环次数. 例如k=4时 ...
- poj 3243 Clever Y && 1467: Pku3243 clever Y【扩展BSGS】
扩展BSGS的板子 对于gcd(a,p)>1的情况 即扩展BSGS 把式子变成等式的形式: \( a^x+yp=b \) 设 \( g=gcd(a,p) \) 那么两边同时除以g就会变成: \( ...
- 扩展BSGS
\(BSGS\) 求解\(a^x\equiv b\pmod p\),且\(a\)与\(p\)互质 由\(a^{φ(p)}\equiv1 \pmod p\)和\(a^0\equiv 1\pmod p\) ...
随机推荐
- 大数相加-----杭电acm1002
#include<stdio.h> #include<string.h> int main() { ], ch2[]; ], num2[]; ; scanf("%d& ...
- 反弹shell备忘录
反弹shell备忘录 简单理解,通常是我们主动发起请求,去访问服务器(某个IP的某个端口),比如我们常访问的web服务器:http(https)://ip:80,这是因为在服务器上面开启了80端口的监 ...
- windows下python3使用pip安装scrapy提示安装失败
我的环境: python3.6, win10, 原因:不能成功安装twisted,因为twisted与高版本的python有兼容问题. 解决:1,先下载twisted二进制文 ...
- C#后台异步消息队列实现
简介 基于生产者消费者模式,我们可以开发出线程安全的异步消息队列. 知识储备 什么是生产者消费者模式? 为了方便理解,我们暂时将它理解为垃圾的产生到结束的过程. 简单来说,多住户产生垃圾(生产者)将垃 ...
- 常用类String的总结
/* String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String实现了Serializable接口:表示字符串是支持序列化的. ...
- Python基础之程序暂停
当我们执行某些程序时,由于机器速度很快导致肉眼无法直接看到执行结果时程序便停止运行.这时候我们迫切需要在程序中暂停,专业术语叫做阻塞.下面列举几种常用的程序暂停方法: input()用法:直接在欲等待 ...
- Linux高性能服务器编程:Linux服务器程序规范
Linux服务器程序一般以后台进程形式运行,后台进程又称守护进程.它没有控制终端,不会接收到用户输入.守护进程的父进程通常是init进程(PID为1). Linux服务器程序有一套日志系统 Linux ...
- day7 基础数据类型&集合&深浅拷贝
基础数据类型汇总: #!/usr/bin/env python # -*- coding:utf-8 -*- ''' str int ''' # str s = ' a' print(s.isspac ...
- Postman实现文件下载功能测试
背景 实现一个模板下载的功能,然后想用postman进行文件下载的功能测试 实现 然后会弹出下载框 tips:我第一次点的时候,没有任何反应,以为是卡死了,后来发现是弹出的下载框在postman框下面 ...
- ssh 或 putty 连接linux报错解决方法
由于当天多次输入错误密码,ssh和putty就连接不上了,纠结了很久解决问题 ssh连接提示错误:server unexpectedly closed network connection putty ...