博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【模板】【数论】二次剩余Cipolla算法,离散对数BSGS 算法
阅读量:5836 次
发布时间:2019-06-18

本文共 1814 字,大约阅读时间需要 6 分钟。

Cipolla

LL ksm(LL k,LL n){    LL s=1;    for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo;    return s;}namespace number{    LL D;    struct Z    {        LL x,y;        Z(LL _x=0,LL _y=0){x=_x,y=_y;}    };    Z operator +(const Z &x,const Z &y) {return Z((x.x+y.x)%mo,(x.y+y.y)%mo);}    Z operator -(const Z &x,const Z &y) {return Z((x.x-y.x+mo)%mo,(x.y-y.y+mo)%mo);}    Z operator *(const Z &x,const Z &y) {return Z((x.x*y.x%mo+D*x.y%mo*y.y%mo+mo)%mo,(x.y*y.x%mo+x.x*y.y%mo)%mo);}    Z opt(const Z &x) {return Z(mo-x.x,mo-x.y);}    Z pwr(Z k,LL n)    {        Z s=Z(1,0);        for(;n;n>>=1,k=k*k) if(n&1) s=s*k;        return s;    }}using namespace number;//其实这部分像减法,相反数什么的都没什么用...pair
cipolla(LL k){ k%=mo; if(ksm(k,(mo-1)/2)==mo-1) return make_pair(-1,-1); if(k==0) return make_pair(0,0); LL a=rand()%mo; while(ksm((a*a%mo-k+mo)%mo,(mo-1)/2)<=1) a=rand()%mo; D=(a*a%mo-k+mo)%mo; LL v=(pwr(Z(a,1),(mo+1)/2)).x; return make_pair(v,mo-v);}

BSGS

LL ds[N];int ud[N];#define mo1 10000007vector
h[mo1];LL hp[mo1];int hs(LL v){ int k=v%mo1; while(hp[k]!=-1&&hp[k]!=v) k=(k==mo1-1)?k:k+1; return k;}void BSGS(LL x,LL a){ static LL ds2[N]; ds2[0]=ds[0]=0; LL q=sqrt(mo); ud[0]=0; LL v=a; fo(i,0,q-1) { int w=hs(v); if(hp[w]==-1) ud[++ud[0]]=w,hp[w]=v; h[w].push_back(i); v=v*x%mo; } LL v2=1,vq=ksm(x,q); for(int i=0;i-q<=mo;i+=q) { int w=hs(v2); if(hp[w]!=-1) { int r=h[w].size(); fo(j,0,r-1) ds2[++ds2[0]]=(i-h[w][j]+mo-1)%(mo-1); } v2=v2*vq%mo; } sort(ds2+1,ds2+ds2[0]+1); fo(i,1,ds2[0]) if(i==1||ds2[i]!=ds2[i-1]) ds[++ds[0]]=ds2[i]; fo(i,1,ud[0]) h[ud[i]].clear(),hp[ud[i]]=-1;}

转载于:https://www.cnblogs.com/BAJimH/p/10840816.html

你可能感兴趣的文章
[LeetCode] Copy List with Random Pointer
查看>>
openstack部署之nova
查看>>
JS组件系列——表格组件神器:bootstrap table
查看>>
存储过程Oracle(一)
查看>>
log4j日志归档
查看>>
Java笔记01——IO流
查看>>
mysql遇见error,1049
查看>>
NYOJ311 完全背包
查看>>
codevs——2822 爱在心中
查看>>
Python基础班---第一部分(基础)---Python基础知识---认识Python
查看>>
JAVA MAC 配置
查看>>
1134 最长上升子序列 (序列型 DP)
查看>>
js冒泡排序
查看>>
第一次作业 4班卢炳武
查看>>
const int * 与 int *const
查看>>
抽象类的调用
查看>>
使用硬盘,安装双系统,Win7+CentOS
查看>>
Javascript学习总结
查看>>
JS 操作Excel格式
查看>>
php 用正则替换中文字符一系列问题解决
查看>>