板子:离散对数、BSGS及其算法

本文介绍了离散对数的概念,即寻找最小的r使得a^r=b(mod p)。重点讲解了BSGS(Baby Step Giant Step)算法及其扩展版,包括算法原理、时间复杂度以及在非素数情况下的处理方法,并提供了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

离散对数

求最小的r使得a^r=b(mod p)成立

如果在没有p的时候,r=log(a,b),是个对数

因为有mod,所以叫做离散对数。

如何求离散对数

第一种方法是暴力找r,不多讲了。

下面的方法不怎么讲证明,只管照着步骤弄就行了,以后补证明吧。

BSGS

Baby step Giant step,中文名叫做大步小步法,和它的过程很有关联。

如果P是素数:

因为如果有解,则r一定小于p;

令m=sqrt(p),令r=i*m+j(0<=i<=m,0<=j<=m)

则a^(i*m) * a^j=b(mod p)

分别处理a^j以及a^(i*m),用逆元进行查找。

所以时间复杂度是O(sqrt(p)*logsqrt(m))的。

扩展BSGS

如果P不是素数:

在求逆元的时候可能会出现问题,因此 需要先进性一些处理:

可以直接看代码,反正相当于把代码复述了一遍。

扩展BSGS代码(BSGS也在里面了)

BZOJ 2480: Spoj3105 Mod

#include<queue>
#include<cmath>
#include<cctype>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=350000;
int a,p,b,ans;
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
int exgcd(int a,int b,int &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值