离散对数(Baby Step Giant Step)

现在我来介绍一种算法叫做Baby Step Giant Step它是用来解决如下方程最小正整数解的


           其中


如果,那么我们可以先取模,即,所以在这里我们只讨论的情况。


普通Baby Step Giant Step的步骤是这样的:

    (1)首先确定的下限是0,上限是,我们令

    (2)把的值存到一个Hash表里面

    (3)把的值一一枚举出来,每枚举一个就在Hash表里面寻找是否有一个值满足

        ,如果有则找到答案,否则继续

    (4)最终答案就是的值对应的原来的幂


     上面是普通Baby Step Giant Step的步骤,比较简单,只适用为素数的情况。如果为合数呢?


为合数时,我们就需要把Baby Step Giant Step扩展一下。在普通Baby Step Giant Step中,由于是素数,那么,所以一定有唯一解的。那么,当为合数时,我们可以这样处理:


对于方程,我们拿出若干个出来与来消去公共因子,使得为止,那么此时我们就可以直接通过扩展欧几里得来计算结果了。



题目:http://www.spoj.com/problems/MOD/


#include 
#include 
#include 
#include 

using namespace std;
typedef long long LL;

const int MOD = 99991;
const int N = 100005;

struct Hash
{
    bool f;
    int id;
    int val;
};

Hash hash[N];

void Init()
{
    for(int i=0; i>A>>C>>B)
    {
        Init();
        if(A + B + C == 0) break;
        A %= C; B %= C;
        LL ans = Baby_Step(A,B,C);
        if(ans == -1)
        {
            puts("No Solution");
            continue;
        }
        cout<



你可能感兴趣的:(数论)