• BSGS和EXBSGS


    也许更好的阅读体验

    (Description)

    给定(a,b,p),求一个(x)使其满足(a^xequiv b left(mod p ight))

    (BSGS)

    (BSGS)可以解决(p)质数的情况
    (m=lceil sqrt p ceil)

    (x=icdot m-k)

    (a^{icdot m-k} equiv b (mod p))

    两边同乘 (a^k)(a^{icdot m}equiv bcdot a^k (mod p))

    我们先将右边的 (bcdot a^k) 全部求出来存到一个表里,这样预处理时间复杂度为 (sqrt p)

    之后再枚举 (i)(sqrt p) ,看表里有没有 (a^{icdot m} mod p),有的话就有一组解

    再反向求出(x)即可

    (EXBSGS)

    (p)不是质数
    (g=gcd(a,p))
    (a^{x-1}cdot dfrac{a}{g}cdot g equiv dfrac{b}{g}cdot g left(mod dfrac{p}{g}cdot g ight))
    把那个(g)除掉
    (a^{x-1}cdot dfrac{a}{g} equiv dfrac{b}{g} left(mod dfrac{p}{g} ight))
    然后重复这个过程直到(a,p)互质

    (p)除掉(gcd(a,p))后可能仍与(a)有公约数,与(frac{a}{gcd(a,p)})互质

    显然,在这个过程中如果(p)不能被(b)整除就无解

    到最后会得到这样的方程
    (a^{x-i}cdot cequiv t left(mod p ight))
    (c)是由(a)的幂除以若干个因子得到的 (c,t)肯定互质
    两边乘以(c^{-1})(逆元)
    (a^{x-i}equiv tcdot c^{-1} left(mod p ight))
    (BSGS)(x-i)求解即可
    最后记得加上(i)

    (Code)

    (BSGS)

    ksm(a,b);//return a^b
    gcd(a,b);//return gcd(a,b)
    //{{{bsgs
    int bsgs (int a,int b,int p)//return a^x ≡ b mod p 's x
    {
    	a%=p;
    	if (!a&&!b)	return 1;
    	if (!a)	return -1;
    	int m=sqrt(p);
    	map <int,int> mp;//这里用的map 也可以自己打个哈希
    	int t=b%p;
    	mp[t]=0;
    	for (int i=1;i<=m;++i)	mp[t=1ll*t*a%p]=i;
    	t=1;
    	int mi=ksm(a,m);
    	for (int i=1;1ll*i*i<=p+1;++i){
    		t=1ll*t*mi%p;
    		if (mp.count(t))	return ((1ll*i*m%p-mp[t])%p+p)%p;
    	}
    	return -1;
    }
    //}}}
    
    

    (EXBSGS)

    //{{{exbsgs
    int exbsgs (int a,int b,int p)//a^x ≡ b mod p 's x
    {
    	if (b==1)	return 0;
    	int cnt=0,t=1;
    	for (int g=gcd(a,p);g!=1;g=gcd(a,p)){
    		if (b%g)	return -1;
    		++cnt,b/=g,p/=g;
    		t=1ll*t*a/g%p;
    		if (b==t)	return cnt;
    	}
    	int x=bsgs(a,1ll*ksm(t,p-2)*b%p,p);
    	if (x!=-1)	x+=cnt;
    	return x;
    }
    //}}}
    
    

    如有哪里讲得不是很明白或是有错误,欢迎指正
    如您喜欢的话不妨点个赞收藏一下吧

  • 相关阅读:
    PTA甲级—树
    PTA甲级—链表
    PTA刷题记录
    PTA甲级—数学
    PTA甲级—常用技巧与算法
    PAT甲级—暴力搜索
    Qt连连看(三)非核心功能实现
    常见数据类型取值范围与10的数量级对照
    PTA甲级—STL使用
    Qt连连看(二)界面制作
  • 原文地址:https://www.cnblogs.com/Morning-Glory/p/11610024.html
Copyright © 2020-2023  润新知